1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2013 Lennart Poettering
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
31 #include "alloc-util.h"
32 #include "bus-container.h"
33 #include "bus-control.h"
34 #include "bus-internal.h"
35 #include "bus-kernel.h"
36 #include "bus-label.h"
37 #include "bus-message.h"
38 #include "bus-objects.h"
39 #include "bus-protocol.h"
41 #include "bus-socket.h"
42 #include "bus-track.h"
45 #include "cgroup-util.h"
48 #include "hexdecoct.h"
49 #include "hostname-util.h"
52 #include "parse-util.h"
53 #include "string-util.h"
57 /// Additional includes needed by elogind
58 #include "process-util.h"
60 #define log_debug_bus_message(m) \
62 sd_bus_message *_mm = (m); \
63 log_debug("Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " signature=%s error-name=%s error-message=%s", \
64 bus_message_type_to_string(_mm->header->type), \
65 strna(sd_bus_message_get_sender(_mm)), \
66 strna(sd_bus_message_get_destination(_mm)), \
67 strna(sd_bus_message_get_path(_mm)), \
68 strna(sd_bus_message_get_interface(_mm)), \
69 strna(sd_bus_message_get_member(_mm)), \
70 BUS_MESSAGE_COOKIE(_mm), \
72 strna(_mm->root_container.signature), \
73 strna(_mm->error.name), \
74 strna(_mm->error.message)); \
77 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
78 static void bus_detach_io_events(sd_bus *b);
79 static void bus_detach_inotify_event(sd_bus *b);
81 static thread_local sd_bus *default_system_bus = NULL;
82 #if 0 /// UNNEEDED by elogind
83 static thread_local sd_bus *default_user_bus = NULL;
85 static thread_local sd_bus *default_starter_bus = NULL;
87 void bus_close_io_fds(sd_bus *b) {
90 bus_detach_io_events(b);
92 if (b->input_fd != b->output_fd)
93 safe_close(b->output_fd);
94 b->output_fd = b->input_fd = safe_close(b->input_fd);
97 void bus_close_inotify_fd(sd_bus *b) {
100 bus_detach_inotify_event(b);
102 b->inotify_fd = safe_close(b->inotify_fd);
103 b->inotify_watches = mfree(b->inotify_watches);
104 b->n_inotify_watches = 0;
107 static void bus_reset_queues(sd_bus *b) {
110 while (b->rqueue_size > 0)
111 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
113 b->rqueue = mfree(b->rqueue);
114 b->rqueue_allocated = 0;
116 while (b->wqueue_size > 0)
117 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
119 b->wqueue = mfree(b->wqueue);
120 b->wqueue_allocated = 0;
123 static void bus_free(sd_bus *b) {
127 assert(!b->track_queue);
130 b->state = BUS_CLOSED;
132 sd_bus_detach_event(b);
134 while ((s = b->slots)) {
135 /* At this point only floating slots can still be
136 * around, because the non-floating ones keep a
137 * reference to the bus, and we thus couldn't be
138 * destructing right now... We forcibly disconnect the
139 * slots here, so that they still can be referenced by
140 * apps, but are dead. */
143 bus_slot_disconnect(s);
144 sd_bus_slot_unref(s);
147 if (b->default_bus_ptr)
148 *b->default_bus_ptr = NULL;
151 bus_close_inotify_fd(b);
156 free(b->unique_name);
157 free(b->auth_buffer);
160 free(b->cgroup_root);
161 free(b->description);
164 strv_free(b->exec_argv);
166 close_many(b->fds, b->n_fds);
171 ordered_hashmap_free_free(b->reply_callbacks);
172 prioq_free(b->reply_callbacks_prioq);
174 assert(b->match_callbacks.type == BUS_MATCH_ROOT);
175 bus_match_free(&b->match_callbacks);
177 hashmap_free_free(b->vtable_methods);
178 hashmap_free_free(b->vtable_properties);
180 assert(hashmap_isempty(b->nodes));
181 hashmap_free(b->nodes);
185 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
190 _public_ int sd_bus_new(sd_bus **ret) {
193 assert_return(ret, -EINVAL);
199 r->n_ref = REFCNT_INIT;
200 r->input_fd = r->output_fd = -1;
202 r->message_version = 1;
203 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
205 r->original_pid = getpid_cached();
206 r->n_groups = (size_t) -1;
208 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
210 /* We guarantee that wqueue always has space for at least one
212 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
221 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
224 assert_return(bus, -EINVAL);
225 assert_return(bus->state == BUS_UNSET, -EPERM);
226 assert_return(address, -EINVAL);
227 assert_return(!bus_pid_changed(bus), -ECHILD);
239 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
240 assert_return(bus, -EINVAL);
241 assert_return(bus->state == BUS_UNSET, -EPERM);
242 assert_return(input_fd >= 0, -EBADF);
243 assert_return(output_fd >= 0, -EBADF);
244 assert_return(!bus_pid_changed(bus), -ECHILD);
246 bus->input_fd = input_fd;
247 bus->output_fd = output_fd;
251 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
254 assert_return(bus, -EINVAL);
255 assert_return(bus->state == BUS_UNSET, -EPERM);
256 assert_return(path, -EINVAL);
257 assert_return(!strv_isempty(argv), -EINVAL);
258 assert_return(!bus_pid_changed(bus), -ECHILD);
270 free(bus->exec_path);
271 strv_free(bus->exec_argv);
279 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
280 assert_return(bus, -EINVAL);
281 assert_return(bus->state == BUS_UNSET, -EPERM);
282 assert_return(!bus_pid_changed(bus), -ECHILD);
284 bus->bus_client = !!b;
288 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
289 assert_return(bus, -EINVAL);
290 assert_return(bus->state == BUS_UNSET, -EPERM);
291 assert_return(!bus_pid_changed(bus), -ECHILD);
297 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
298 assert_return(bus, -EINVAL);
299 assert_return(bus->state == BUS_UNSET, -EPERM);
300 assert_return(!bus_pid_changed(bus), -ECHILD);
306 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
307 assert_return(bus, -EINVAL);
308 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
309 assert_return(!bus_pid_changed(bus), -ECHILD);
311 /* This is not actually supported by any of our transports these days, but we do honour it for synthetic
312 * replies, and maybe one day classic D-Bus learns this too */
313 bus->attach_timestamp = b;
318 _public_ int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t mask) {
319 assert_return(bus, -EINVAL);
320 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
321 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
322 assert_return(!bus_pid_changed(bus), -ECHILD);
324 SET_FLAG(bus->creds_mask, mask, b);
326 /* The well knowns we need unconditionally, so that matches can work */
327 bus->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
332 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
333 assert_return(bus, -EINVAL);
334 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
335 assert_return(bus->state == BUS_UNSET, -EPERM);
336 assert_return(!bus_pid_changed(bus), -ECHILD);
338 bus->is_server = !!b;
339 bus->server_id = server_id;
343 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
344 assert_return(bus, -EINVAL);
345 assert_return(bus->state == BUS_UNSET, -EPERM);
346 assert_return(!bus_pid_changed(bus), -ECHILD);
348 bus->anonymous_auth = !!b;
352 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
353 assert_return(bus, -EINVAL);
354 assert_return(bus->state == BUS_UNSET, -EPERM);
355 assert_return(!bus_pid_changed(bus), -ECHILD);
361 _public_ int sd_bus_set_description(sd_bus *bus, const char *description) {
362 assert_return(bus, -EINVAL);
363 assert_return(bus->state == BUS_UNSET, -EPERM);
364 assert_return(!bus_pid_changed(bus), -ECHILD);
366 return free_and_strdup(&bus->description, description);
369 _public_ int sd_bus_set_allow_interactive_authorization(sd_bus *bus, int b) {
370 assert_return(bus, -EINVAL);
371 assert_return(!bus_pid_changed(bus), -ECHILD);
373 bus->allow_interactive_authorization = !!b;
377 _public_ int sd_bus_get_allow_interactive_authorization(sd_bus *bus) {
378 assert_return(bus, -EINVAL);
379 assert_return(!bus_pid_changed(bus), -ECHILD);
381 return bus->allow_interactive_authorization;
384 _public_ int sd_bus_set_watch_bind(sd_bus *bus, int b) {
385 assert_return(bus, -EINVAL);
386 assert_return(bus->state == BUS_UNSET, -EPERM);
387 assert_return(!bus_pid_changed(bus), -ECHILD);
393 _public_ int sd_bus_get_watch_bind(sd_bus *bus) {
394 assert_return(bus, -EINVAL);
395 assert_return(!bus_pid_changed(bus), -ECHILD);
397 return bus->watch_bind;
400 static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) {
408 assert(IN_SET(bus->state, BUS_HELLO, BUS_CLOSING));
410 r = sd_bus_message_get_errno(reply);
414 r = sd_bus_message_read(reply, "s", &s);
418 if (!service_name_is_valid(s) || s[0] != ':')
421 bus->unique_name = strdup(s);
422 if (!bus->unique_name)
425 if (bus->state == BUS_HELLO)
426 bus->state = BUS_RUNNING;
431 static int bus_send_hello(sd_bus *bus) {
432 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
437 if (!bus->bus_client)
440 r = sd_bus_message_new_method_call(
443 "org.freedesktop.DBus",
444 "/org/freedesktop/DBus",
445 "org.freedesktop.DBus",
450 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
453 int bus_start_running(sd_bus *bus) {
454 struct reply_callback *c;
459 assert(bus->state < BUS_HELLO);
461 /* We start all method call timeouts when we enter BUS_HELLO or BUS_RUNNING mode. At this point let's convert
462 * all relative to absolute timestamps. Note that we do not reshuffle the reply callback priority queue since
463 * adding a fixed value to all entries should not alter the internal order. */
465 n = now(CLOCK_MONOTONIC);
466 ORDERED_HASHMAP_FOREACH(c, bus->reply_callbacks, i) {
467 if (c->timeout_usec == 0)
470 c->timeout_usec = usec_add(n, c->timeout_usec);
473 if (bus->bus_client) {
474 bus->state = BUS_HELLO;
478 bus->state = BUS_RUNNING;
482 static int parse_address_key(const char **p, const char *key, char **value) {
483 size_t l, n = 0, allocated = 0;
493 if (strncmp(*p, key, l) != 0)
506 while (!IN_SET(*a, ';', ',', 0)) {
524 c = (char) ((x << 4) | y);
531 if (!GREEDY_REALLOC(r, allocated, n + 2))
555 static void skip_address_key(const char **p) {
559 *p += strcspn(*p, ",");
565 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
566 _cleanup_free_ char *path = NULL, *abstract = NULL;
575 while (!IN_SET(**p, 0, ';')) {
576 r = parse_address_key(p, "guid", guid);
582 r = parse_address_key(p, "path", &path);
588 r = parse_address_key(p, "abstract", &abstract);
597 if (!path && !abstract)
600 if (path && abstract)
605 if (l > sizeof(b->sockaddr.un.sun_path))
608 b->sockaddr.un.sun_family = AF_UNIX;
609 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
610 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
611 } else if (abstract) {
612 l = strlen(abstract);
613 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
616 b->sockaddr.un.sun_family = AF_UNIX;
617 b->sockaddr.un.sun_path[0] = 0;
618 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
619 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
627 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
628 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
630 struct addrinfo *result, hints = {
631 .ai_socktype = SOCK_STREAM,
632 .ai_flags = AI_ADDRCONFIG,
640 while (!IN_SET(**p, 0, ';')) {
641 r = parse_address_key(p, "guid", guid);
647 r = parse_address_key(p, "host", &host);
653 r = parse_address_key(p, "port", &port);
659 r = parse_address_key(p, "family", &family);
672 if (streq(family, "ipv4"))
673 hints.ai_family = AF_INET;
674 else if (streq(family, "ipv6"))
675 hints.ai_family = AF_INET6;
680 r = getaddrinfo(host, port, &hints, &result);
684 return -EADDRNOTAVAIL;
686 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
687 b->sockaddr_size = result->ai_addrlen;
689 freeaddrinfo(result);
696 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
698 unsigned n_argv = 0, j;
700 size_t allocated = 0;
708 while (!IN_SET(**p, 0, ';')) {
709 r = parse_address_key(p, "guid", guid);
715 r = parse_address_key(p, "path", &path);
721 if (startswith(*p, "argv")) {
725 ul = strtoul(*p + 4, (char**) p, 10);
726 if (errno > 0 || **p != '=' || ul > 256) {
734 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
742 r = parse_address_key(p, NULL, argv + ul);
757 /* Make sure there are no holes in the array, with the
758 * exception of argv[0] */
759 for (j = 1; j < n_argv; j++)
765 if (argv && argv[0] == NULL) {
766 argv[0] = strdup(path);
781 for (j = 0; j < n_argv; j++)
789 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
790 _cleanup_free_ char *machine = NULL, *pid = NULL;
798 while (!IN_SET(**p, 0, ';')) {
799 r = parse_address_key(p, "guid", guid);
805 r = parse_address_key(p, "machine", &machine);
811 r = parse_address_key(p, "pid", &pid);
820 if (!machine == !pid)
824 if (!machine_name_is_valid(machine))
827 free_and_replace(b->machine, machine);
829 b->machine = mfree(b->machine);
833 r = parse_pid(pid, &b->nspid);
839 b->sockaddr.un.sun_family = AF_UNIX;
840 /* Note that we use the old /var/run prefix here, to increase compatibility with really old containers */
841 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
842 b->sockaddr_size = SOCKADDR_UN_LEN(b->sockaddr.un);
848 static void bus_reset_parsed_address(sd_bus *b) {
852 b->sockaddr_size = 0;
853 b->exec_argv = strv_free(b->exec_argv);
854 b->exec_path = mfree(b->exec_path);
855 b->server_id = SD_ID128_NULL;
856 b->machine = mfree(b->machine);
860 static int bus_parse_next_address(sd_bus *b) {
861 _cleanup_free_ char *guid = NULL;
869 if (b->address[b->address_index] == 0)
872 bus_reset_parsed_address(b);
874 a = b->address + b->address_index;
883 if (startswith(a, "unix:")) {
886 r = parse_unix_address(b, &a, &guid);
891 } else if (startswith(a, "tcp:")) {
894 r = parse_tcp_address(b, &a, &guid);
900 } else if (startswith(a, "unixexec:")) {
903 r = parse_exec_address(b, &a, &guid);
909 } else if (startswith(a, "x-machine-unix:")) {
912 r = parse_container_unix_address(b, &a, &guid);
925 r = sd_id128_from_string(guid, &b->server_id);
930 b->address_index = a - b->address;
934 static int bus_start_address(sd_bus *b) {
941 bus_close_inotify_fd(b);
943 /* If you provide multiple different bus-addresses, we
944 * try all of them in order and use the first one that
948 r = bus_socket_exec(b);
949 else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC)
950 r = bus_container_connect_socket(b);
951 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
952 r = bus_socket_connect(b);
959 q = bus_attach_io_events(b);
963 q = bus_attach_inotify_event(b);
970 b->last_connect_error = -r;
973 r = bus_parse_next_address(b);
977 return b->last_connect_error > 0 ? -b->last_connect_error : -ECONNREFUSED;
981 int bus_next_address(sd_bus *b) {
984 bus_reset_parsed_address(b);
985 return bus_start_address(b);
988 static int bus_start_fd(sd_bus *b) {
993 assert(b->input_fd >= 0);
994 assert(b->output_fd >= 0);
996 r = fd_nonblock(b->input_fd, true);
1000 r = fd_cloexec(b->input_fd, true);
1004 if (b->input_fd != b->output_fd) {
1005 r = fd_nonblock(b->output_fd, true);
1009 r = fd_cloexec(b->output_fd, true);
1014 if (fstat(b->input_fd, &st) < 0)
1017 return bus_socket_take_fd(b);
1020 _public_ int sd_bus_start(sd_bus *bus) {
1023 assert_return(bus, -EINVAL);
1024 assert_return(bus->state == BUS_UNSET, -EPERM);
1025 assert_return(!bus_pid_changed(bus), -ECHILD);
1027 bus->state = BUS_OPENING;
1029 if (bus->is_server && bus->bus_client)
1032 if (bus->input_fd >= 0)
1033 r = bus_start_fd(bus);
1034 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->machine)
1035 r = bus_start_address(bus);
1044 return bus_send_hello(bus);
1047 _public_ int sd_bus_open(sd_bus **ret) {
1052 assert_return(ret, -EINVAL);
1054 /* Let's connect to the starter bus if it is set, and
1055 * otherwise to the bus that is appropropriate for the scope
1056 * we are running in */
1058 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1060 if (streq(e, "system"))
1061 return sd_bus_open_system(ret);
1062 #if 0 /// elogind does not support systemd user instances
1063 else if (STR_IN_SET(e, "session", "user"))
1064 return sd_bus_open_user(ret);
1068 e = secure_getenv("DBUS_STARTER_ADDRESS");
1070 #if 0 /// elogind does not support systemd user instances
1071 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1072 return sd_bus_open_user(ret);
1075 return sd_bus_open_system(ret);
1082 r = sd_bus_set_address(b, e);
1086 b->bus_client = true;
1088 /* We don't know whether the bus is trusted or not, so better
1089 * be safe, and authenticate everything */
1091 b->is_local = false;
1092 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1094 r = sd_bus_start(b);
1106 int bus_set_address_system(sd_bus *b) {
1110 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1112 return sd_bus_set_address(b, e);
1114 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1117 _public_ int sd_bus_open_system(sd_bus **ret) {
1121 assert_return(ret, -EINVAL);
1127 r = bus_set_address_system(b);
1131 b->bus_client = true;
1132 b->is_system = true;
1134 /* Let's do per-method access control on the system bus. We
1135 * need the caller's UID and capability set for that. */
1137 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1140 r = sd_bus_start(b);
1152 #if 0 /// elogind can not open/use a user bus
1153 int bus_set_address_user(sd_bus *b) {
1155 _cleanup_free_ char *ee = NULL, *s = NULL;
1159 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1161 return sd_bus_set_address(b, e);
1163 e = secure_getenv("XDG_RUNTIME_DIR");
1167 ee = bus_address_escape(e);
1171 if (asprintf(&s, DEFAULT_USER_BUS_ADDRESS_FMT, ee) < 0)
1181 _public_ int sd_bus_open_user(sd_bus **ret) {
1182 #if 0 /// elogind does not support user buses
1186 assert_return(ret, -EINVAL);
1192 r = bus_set_address_user(b);
1196 b->bus_client = true;
1199 /* We don't do any per-method access control on the user
1204 r = sd_bus_start(b);
1215 return sd_bus_open_system(ret);
1219 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1220 _cleanup_free_ char *e = NULL;
1221 char *m = NULL, *c = NULL;
1226 /* Let's see if we shall enter some container */
1227 m = strchr(host, ':');
1231 /* Let's make sure this is not a port of some kind,
1232 * and is a valid machine name. */
1233 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1236 /* Cut out the host part */
1237 t = strndupa(host, m - host - 1);
1238 e = bus_address_escape(t);
1242 c = strjoina(",argv5=--machine=", m);
1247 e = bus_address_escape(host);
1252 b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e, ",argv4=systemd-stdio-bridge", c);
1259 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1263 assert_return(host, -EINVAL);
1264 assert_return(ret, -EINVAL);
1266 r = sd_bus_new(&bus);
1270 r = bus_set_address_system_remote(bus, host);
1274 bus->bus_client = true;
1275 bus->trusted = false;
1276 bus->is_system = true;
1277 bus->is_local = false;
1279 r = sd_bus_start(bus);
1291 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1292 _cleanup_free_ char *e = NULL;
1297 e = bus_address_escape(machine);
1301 b->address = strjoin("x-machine-unix:machine=", e);
1308 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1312 assert_return(machine, -EINVAL);
1313 assert_return(ret, -EINVAL);
1314 assert_return(machine_name_is_valid(machine), -EINVAL);
1316 r = sd_bus_new(&bus);
1320 r = bus_set_address_system_machine(bus, machine);
1324 bus->bus_client = true;
1325 bus->trusted = false;
1326 bus->is_system = true;
1327 bus->is_local = false;
1329 r = sd_bus_start(bus);
1341 _public_ void sd_bus_close(sd_bus *bus) {
1345 if (bus->state == BUS_CLOSED)
1347 if (bus_pid_changed(bus))
1350 bus->state = BUS_CLOSED;
1352 sd_bus_detach_event(bus);
1354 /* Drop all queued messages so that they drop references to
1355 * the bus object and the bus may be freed */
1356 bus_reset_queues(bus);
1358 bus_close_io_fds(bus);
1359 bus_close_inotify_fd(bus);
1362 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1370 return sd_bus_unref(bus);
1373 void bus_enter_closing(sd_bus *bus) {
1376 if (!IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING, BUS_HELLO, BUS_RUNNING))
1379 bus->state = BUS_CLOSING;
1382 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1387 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1392 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1398 i = REFCNT_DEC(bus->n_ref);
1406 _public_ int sd_bus_is_open(sd_bus *bus) {
1408 assert_return(bus, -EINVAL);
1409 assert_return(!bus_pid_changed(bus), -ECHILD);
1411 return BUS_IS_OPEN(bus->state);
1414 _public_ int sd_bus_is_ready(sd_bus *bus) {
1415 assert_return(bus, -EINVAL);
1416 assert_return(!bus_pid_changed(bus), -ECHILD);
1418 return bus->state == BUS_RUNNING;
1421 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1424 assert_return(bus, -EINVAL);
1425 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1426 assert_return(!bus_pid_changed(bus), -ECHILD);
1428 if (bus->is_monitor)
1431 if (type == SD_BUS_TYPE_UNIX_FD) {
1432 if (!bus->accept_fd)
1435 r = bus_ensure_running(bus);
1439 return bus->can_fds;
1442 return bus_type_is_valid(type);
1445 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1448 assert_return(bus, -EINVAL);
1449 assert_return(id, -EINVAL);
1450 assert_return(!bus_pid_changed(bus), -ECHILD);
1452 r = bus_ensure_running(bus);
1456 *id = bus->server_id;
1460 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1465 /* If we copy the same message to multiple
1466 * destinations, avoid using the same cookie
1468 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1473 timeout = BUS_DEFAULT_TIMEOUT;
1475 return sd_bus_message_seal(m, ++b->cookie, timeout);
1478 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1479 bool remarshal = false;
1483 /* wrong packet version */
1484 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1487 /* wrong packet endianness */
1488 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1491 return remarshal ? bus_message_remarshal(b, m) : 0;
1494 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1498 /* Fake some timestamps, if they were requested, and not
1499 * already initialized */
1500 if (b->attach_timestamp) {
1501 if (m->realtime <= 0)
1502 m->realtime = now(CLOCK_REALTIME);
1504 if (m->monotonic <= 0)
1505 m->monotonic = now(CLOCK_MONOTONIC);
1508 /* The bus specification says the serial number cannot be 0,
1509 * hence let's fill something in for synthetic messages. Since
1510 * synthetic messages might have a fake sender and we don't
1511 * want to interfere with the real sender's serial numbers we
1512 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1513 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1514 * even though kdbus can do 64bit. */
1515 return sd_bus_message_seal(m, 0xFFFFFFFFULL, 0);
1518 static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
1524 r = bus_socket_write_message(bus, m, idx);
1528 if (*idx >= BUS_MESSAGE_SIZE(m))
1529 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",
1530 bus_message_type_to_string(m->header->type),
1531 strna(sd_bus_message_get_sender(m)),
1532 strna(sd_bus_message_get_destination(m)),
1533 strna(sd_bus_message_get_path(m)),
1534 strna(sd_bus_message_get_interface(m)),
1535 strna(sd_bus_message_get_member(m)),
1536 BUS_MESSAGE_COOKIE(m),
1538 strna(m->root_container.signature),
1539 strna(m->error.name),
1540 strna(m->error.message));
1545 static int dispatch_wqueue(sd_bus *bus) {
1549 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1551 while (bus->wqueue_size > 0) {
1553 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
1557 /* Didn't do anything this time */
1559 else if (bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1560 /* Fully written. Let's drop the entry from
1563 * This isn't particularly optimized, but
1564 * well, this is supposed to be our worst-case
1565 * buffer only, and the socket buffer is
1566 * supposed to be our primary buffer, and if
1567 * it got full, then all bets are off
1571 sd_bus_message_unref(bus->wqueue[0]);
1572 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1582 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1585 return bus_socket_read_message(bus);
1588 int bus_rqueue_make_room(sd_bus *bus) {
1591 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1594 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1600 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1605 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1607 /* Note that the priority logic is only available on kdbus,
1608 * where the rqueue is unused. We check the rqueue here
1609 * anyway, because it's simple... */
1612 if (bus->rqueue_size > 0) {
1613 /* Dispatch a queued message */
1615 *m = bus->rqueue[0];
1617 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1621 /* Try to read a new message */
1622 r = bus_read_message(bus, hint_priority, priority);
1632 static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
1633 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1636 assert_return(m, -EINVAL);
1641 assert_return(!bus_pid_changed(bus), -ECHILD);
1643 if (!BUS_IS_OPEN(bus->state))
1647 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1654 /* If the cookie number isn't kept, then we know that no reply
1656 if (!cookie && !m->sealed)
1657 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1659 r = bus_seal_message(bus, m, 0);
1663 /* Remarshall if we have to. This will possibly unref the
1664 * message and place a replacement in m */
1665 r = bus_remarshal_message(bus, &m);
1669 /* If this is a reply and no reply was requested, then let's
1670 * suppress this, if we can */
1674 if (IN_SET(bus->state, BUS_RUNNING, BUS_HELLO) && bus->wqueue_size <= 0) {
1677 r = bus_write_message(bus, m, hint_sync_call, &idx);
1679 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
1680 bus_enter_closing(bus);
1687 if (idx < BUS_MESSAGE_SIZE(m)) {
1688 /* Wasn't fully written. So let's remember how
1689 * much was written. Note that the first entry
1690 * of the wqueue array is always allocated so
1691 * that we always can remember how much was
1693 bus->wqueue[0] = sd_bus_message_ref(m);
1694 bus->wqueue_size = 1;
1699 /* Just append it to the queue. */
1701 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1704 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1707 bus->wqueue[bus->wqueue_size++] = sd_bus_message_ref(m);
1712 *cookie = BUS_MESSAGE_COOKIE(m);
1717 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1718 return bus_send_internal(bus, m, cookie, false);
1721 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1724 assert_return(m, -EINVAL);
1729 assert_return(!bus_pid_changed(bus), -ECHILD);
1731 if (!BUS_IS_OPEN(bus->state))
1734 if (!streq_ptr(m->destination, destination)) {
1739 r = sd_bus_message_set_destination(m, destination);
1744 return sd_bus_send(bus, m, cookie);
1747 static usec_t calc_elapse(sd_bus *bus, uint64_t usec) {
1750 if (usec == (uint64_t) -1)
1753 /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
1754 * with any connection setup states. Hence, if a method callback is started earlier than that we just store the
1755 * relative timestamp, and afterwards the absolute one. */
1757 if (IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING))
1760 return now(CLOCK_MONOTONIC) + usec;
1763 static int timeout_compare(const void *a, const void *b) {
1764 const struct reply_callback *x = a, *y = b;
1766 if (x->timeout_usec != 0 && y->timeout_usec == 0)
1769 if (x->timeout_usec == 0 && y->timeout_usec != 0)
1772 if (x->timeout_usec < y->timeout_usec)
1775 if (x->timeout_usec > y->timeout_usec)
1781 _public_ int sd_bus_call_async(
1785 sd_bus_message_handler_t callback,
1789 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1790 _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *s = NULL;
1793 assert_return(m, -EINVAL);
1794 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1795 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1796 assert_return(callback, -EINVAL);
1801 assert_return(!bus_pid_changed(bus), -ECHILD);
1803 if (!BUS_IS_OPEN(bus->state))
1806 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
1810 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1814 r = bus_seal_message(bus, m, usec);
1818 r = bus_remarshal_message(bus, &m);
1822 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
1826 s->reply_callback.callback = callback;
1828 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
1829 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
1831 s->reply_callback.cookie = 0;
1835 s->reply_callback.timeout_usec = calc_elapse(bus, m->timeout);
1836 if (s->reply_callback.timeout_usec != 0) {
1837 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
1839 s->reply_callback.timeout_usec = 0;
1844 r = sd_bus_send(bus, m, &s->reply_callback.cookie);
1855 int bus_ensure_running(sd_bus *bus) {
1860 if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
1862 if (bus->state == BUS_RUNNING)
1866 r = sd_bus_process(bus, NULL);
1869 if (bus->state == BUS_RUNNING)
1874 r = sd_bus_wait(bus, (uint64_t) -1);
1880 _public_ int sd_bus_call(
1884 sd_bus_error *error,
1885 sd_bus_message **reply) {
1887 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1893 bus_assert_return(m, -EINVAL, error);
1894 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
1895 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
1896 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
1901 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
1903 if (!BUS_IS_OPEN(bus->state)) {
1908 r = bus_ensure_running(bus);
1912 i = bus->rqueue_size;
1914 r = bus_seal_message(bus, m, usec);
1918 r = bus_remarshal_message(bus, &m);
1922 r = bus_send_internal(bus, m, &cookie, true);
1926 timeout = calc_elapse(bus, m->timeout);
1931 while (i < bus->rqueue_size) {
1932 sd_bus_message *incoming = NULL;
1934 incoming = bus->rqueue[i];
1936 if (incoming->reply_cookie == cookie) {
1937 /* Found a match! */
1939 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1941 log_debug_bus_message(incoming);
1943 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
1945 if (incoming->n_fds <= 0 || bus->accept_fd) {
1949 sd_bus_message_unref(incoming);
1954 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
1955 sd_bus_message_unref(incoming);
1958 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
1959 r = sd_bus_error_copy(error, &incoming->error);
1960 sd_bus_message_unref(incoming);
1967 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
1970 streq(bus->unique_name, incoming->sender)) {
1972 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1975 /* Our own message? Somebody is trying
1976 * to send its own client a message,
1977 * let's not dead-lock, let's fail
1980 sd_bus_message_unref(incoming);
1985 /* Try to read more, right-away */
1989 r = bus_read_message(bus, false, 0);
1991 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
1992 bus_enter_closing(bus);
2004 n = now(CLOCK_MONOTONIC);
2012 left = (uint64_t) -1;
2014 r = bus_poll(bus, true, left);
2022 r = dispatch_wqueue(bus);
2024 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2025 bus_enter_closing(bus);
2034 return sd_bus_error_set_errno(error, r);
2037 _public_ int sd_bus_get_fd(sd_bus *bus) {
2039 assert_return(bus, -EINVAL);
2040 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2041 assert_return(!bus_pid_changed(bus), -ECHILD);
2043 if (bus->state == BUS_CLOSED)
2046 if (bus->inotify_fd >= 0)
2047 return bus->inotify_fd;
2049 if (bus->input_fd >= 0)
2050 return bus->input_fd;
2055 _public_ int sd_bus_get_events(sd_bus *bus) {
2058 assert_return(bus, -EINVAL);
2059 assert_return(!bus_pid_changed(bus), -ECHILD);
2061 switch (bus->state) {
2067 case BUS_WATCH_BIND:
2075 case BUS_AUTHENTICATING:
2076 if (bus_socket_auth_needs_write(bus))
2084 if (bus->rqueue_size <= 0)
2086 if (bus->wqueue_size > 0)
2094 assert_not_reached("Unknown state");
2100 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2101 struct reply_callback *c;
2103 assert_return(bus, -EINVAL);
2104 assert_return(timeout_usec, -EINVAL);
2105 assert_return(!bus_pid_changed(bus), -ECHILD);
2107 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2110 if (bus->track_queue) {
2115 switch (bus->state) {
2117 case BUS_AUTHENTICATING:
2118 *timeout_usec = bus->auth_timeout;
2123 if (bus->rqueue_size > 0) {
2128 c = prioq_peek(bus->reply_callbacks_prioq);
2130 *timeout_usec = (uint64_t) -1;
2134 if (c->timeout_usec == 0) {
2135 *timeout_usec = (uint64_t) -1;
2139 *timeout_usec = c->timeout_usec;
2146 case BUS_WATCH_BIND:
2148 *timeout_usec = (uint64_t) -1;
2152 assert_not_reached("Unknown or unexpected stat");
2156 static int process_timeout(sd_bus *bus) {
2157 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2158 _cleanup_(sd_bus_message_unrefp) sd_bus_message* m = NULL;
2159 struct reply_callback *c;
2166 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2168 c = prioq_peek(bus->reply_callbacks_prioq);
2172 n = now(CLOCK_MONOTONIC);
2173 if (c->timeout_usec > n)
2176 r = bus_message_new_synthetic_error(
2179 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2184 r = bus_seal_synthetic_message(bus, m);
2188 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2189 c->timeout_usec = 0;
2191 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2194 slot = container_of(c, sd_bus_slot, reply_callback);
2196 bus->iteration_counter++;
2198 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2200 bus->current_message = m;
2201 bus->current_slot = sd_bus_slot_ref(slot);
2202 bus->current_handler = c->callback;
2203 bus->current_userdata = slot->userdata;
2204 r = c->callback(m, slot->userdata, &error_buffer);
2205 bus->current_userdata = NULL;
2206 bus->current_handler = NULL;
2207 bus->current_slot = NULL;
2208 bus->current_message = NULL;
2210 if (slot->floating) {
2211 bus_slot_disconnect(slot);
2212 sd_bus_slot_unref(slot);
2215 sd_bus_slot_unref(slot);
2217 /* When this is the hello message and it timed out, then make sure to propagate the error up, don't just log
2218 * and ignore the callback handler's return value. */
2222 return bus_maybe_reply_error(m, r, &error_buffer);
2225 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2229 if (bus->state != BUS_HELLO)
2232 /* Let's make sure the first message on the bus is the HELLO
2233 * reply. But note that we don't actually parse the message
2234 * here (we leave that to the usual handling), we just verify
2235 * we don't let any earlier msg through. */
2237 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2240 if (m->reply_cookie != 1)
2246 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2247 _cleanup_(sd_bus_message_unrefp) sd_bus_message *synthetic_reply = NULL;
2248 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2249 struct reply_callback *c;
2257 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2260 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2263 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2269 slot = container_of(c, sd_bus_slot, reply_callback);
2271 if (m->n_fds > 0 && !bus->accept_fd) {
2273 /* If the reply contained a file descriptor which we
2274 * didn't want we pass an error instead. */
2276 r = bus_message_new_synthetic_error(
2279 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2284 /* Copy over original timestamp */
2285 synthetic_reply->realtime = m->realtime;
2286 synthetic_reply->monotonic = m->monotonic;
2287 synthetic_reply->seqnum = m->seqnum;
2289 r = bus_seal_synthetic_message(bus, synthetic_reply);
2293 m = synthetic_reply;
2295 r = sd_bus_message_rewind(m, true);
2300 if (c->timeout_usec != 0) {
2301 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2302 c->timeout_usec = 0;
2305 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2307 bus->current_slot = sd_bus_slot_ref(slot);
2308 bus->current_handler = c->callback;
2309 bus->current_userdata = slot->userdata;
2310 r = c->callback(m, slot->userdata, &error_buffer);
2311 bus->current_userdata = NULL;
2312 bus->current_handler = NULL;
2313 bus->current_slot = 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 failed, then make sure to propagate the error up, don't just log and
2323 * ignore the callback handler's return value. */
2327 return bus_maybe_reply_error(m, r, &error_buffer);
2330 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2331 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2332 struct filter_callback *l;
2339 bus->filter_callbacks_modified = false;
2341 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2344 if (bus->filter_callbacks_modified)
2347 /* Don't run this more than once per iteration */
2348 if (l->last_iteration == bus->iteration_counter)
2351 l->last_iteration = bus->iteration_counter;
2353 r = sd_bus_message_rewind(m, true);
2357 slot = container_of(l, sd_bus_slot, filter_callback);
2359 bus->current_slot = sd_bus_slot_ref(slot);
2360 bus->current_handler = l->callback;
2361 bus->current_userdata = slot->userdata;
2362 r = l->callback(m, slot->userdata, &error_buffer);
2363 bus->current_userdata = NULL;
2364 bus->current_handler = NULL;
2365 bus->current_slot = sd_bus_slot_unref(slot);
2367 r = bus_maybe_reply_error(m, r, &error_buffer);
2373 } while (bus->filter_callbacks_modified);
2378 static int process_match(sd_bus *bus, sd_bus_message *m) {
2385 bus->match_callbacks_modified = false;
2387 r = bus_match_run(bus, &bus->match_callbacks, m);
2391 } while (bus->match_callbacks_modified);
2396 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2397 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
2403 if (bus->is_monitor)
2406 if (bus->manual_peer_interface)
2409 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2412 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2415 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2418 if (streq_ptr(m->member, "Ping"))
2419 r = sd_bus_message_new_method_return(m, &reply);
2420 else if (streq_ptr(m->member, "GetMachineId")) {
2424 r = sd_id128_get_machine(&id);
2428 r = sd_bus_message_new_method_return(m, &reply);
2432 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2434 r = sd_bus_message_new_method_errorf(
2436 SD_BUS_ERROR_UNKNOWN_METHOD,
2437 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2443 r = sd_bus_send(bus, reply, NULL);
2450 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2454 /* If we got a message with a file descriptor which we didn't
2455 * want to accept, then let's drop it. How can this even
2456 * happen? For example, when the kernel queues a message into
2457 * an activatable names's queue which allows fds, and then is
2458 * delivered to us later even though we ourselves did not
2461 if (bus->is_monitor)
2470 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2471 return 1; /* just eat it up */
2473 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2476 static int process_message(sd_bus *bus, sd_bus_message *m) {
2482 bus->current_message = m;
2483 bus->iteration_counter++;
2485 log_debug_bus_message(m);
2487 r = process_hello(bus, m);
2491 r = process_reply(bus, m);
2495 r = process_fd_check(bus, m);
2499 r = process_filter(bus, m);
2503 r = process_match(bus, m);
2507 r = process_builtin(bus, m);
2511 r = bus_process_object(bus, m);
2514 bus->current_message = NULL;
2518 static int dispatch_track(sd_bus *bus) {
2521 if (!bus->track_queue)
2524 bus_track_dispatch(bus->track_queue);
2528 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2529 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2533 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2535 r = process_timeout(bus);
2539 r = dispatch_wqueue(bus);
2543 r = dispatch_track(bus);
2547 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2553 r = process_message(bus, m);
2558 r = sd_bus_message_rewind(m, true);
2567 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2569 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2570 strna(sd_bus_message_get_sender(m)),
2571 strna(sd_bus_message_get_path(m)),
2572 strna(sd_bus_message_get_interface(m)),
2573 strna(sd_bus_message_get_member(m)));
2575 r = sd_bus_reply_method_errorf(
2577 SD_BUS_ERROR_UNKNOWN_OBJECT,
2578 "Unknown object '%s'.", m->path);
2592 static int bus_exit_now(sd_bus *bus) {
2595 /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
2596 * sd_event_exit(), otherwise invokes libc exit(). */
2598 if (bus->exited) /* did we already exit? */
2600 if (!bus->exit_triggered) /* was the exit condition triggered? */
2602 if (!bus->exit_on_disconnect) /* Shall we actually exit on disconnection? */
2605 bus->exited = true; /* never exit more than once */
2607 log_debug("Bus connection disconnected, exiting.");
2610 return sd_event_exit(bus->event, EXIT_FAILURE);
2614 assert_not_reached("exit() didn't exit?");
2617 static int process_closing_reply_callback(sd_bus *bus, struct reply_callback *c) {
2618 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2619 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2626 r = bus_message_new_synthetic_error(
2629 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2634 r = bus_seal_synthetic_message(bus, m);
2638 if (c->timeout_usec != 0) {
2639 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2640 c->timeout_usec = 0;
2643 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2646 slot = container_of(c, sd_bus_slot, reply_callback);
2648 bus->iteration_counter++;
2650 bus->current_message = m;
2651 bus->current_slot = sd_bus_slot_ref(slot);
2652 bus->current_handler = c->callback;
2653 bus->current_userdata = slot->userdata;
2654 r = c->callback(m, slot->userdata, &error_buffer);
2655 bus->current_userdata = NULL;
2656 bus->current_handler = NULL;
2657 bus->current_slot = NULL;
2658 bus->current_message = NULL;
2660 if (slot->floating) {
2661 bus_slot_disconnect(slot);
2662 sd_bus_slot_unref(slot);
2665 sd_bus_slot_unref(slot);
2667 return bus_maybe_reply_error(m, r, &error_buffer);
2670 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2671 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2672 struct reply_callback *c;
2676 assert(bus->state == BUS_CLOSING);
2678 /* First, fail all outstanding method calls */
2679 c = ordered_hashmap_first(bus->reply_callbacks);
2681 return process_closing_reply_callback(bus, c);
2683 /* Then, fake-drop all remaining bus tracking references */
2685 bus_track_close(bus->tracks);
2689 /* Then, synthesize a Disconnected message */
2690 r = sd_bus_message_new_signal(
2693 "/org/freedesktop/DBus/Local",
2694 "org.freedesktop.DBus.Local",
2699 bus_message_set_sender_local(bus, m);
2701 r = bus_seal_synthetic_message(bus, m);
2707 bus->current_message = m;
2708 bus->iteration_counter++;
2710 r = process_filter(bus, m);
2714 r = process_match(bus, m);
2718 /* Nothing else to do, exit now, if the condition holds */
2719 bus->exit_triggered = true;
2720 (void) bus_exit_now(bus);
2730 bus->current_message = NULL;
2735 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2736 BUS_DONT_DESTROY(bus);
2739 /* Returns 0 when we didn't do anything. This should cause the
2740 * caller to invoke sd_bus_wait() before returning the next
2741 * time. Returns > 0 when we did something, which possibly
2742 * means *ret is filled in with an unprocessed message. */
2744 assert_return(bus, -EINVAL);
2745 assert_return(!bus_pid_changed(bus), -ECHILD);
2747 /* We don't allow recursively invoking sd_bus_process(). */
2748 assert_return(!bus->current_message, -EBUSY);
2749 assert(!bus->current_slot);
2751 switch (bus->state) {
2759 case BUS_WATCH_BIND:
2760 r = bus_socket_process_watch_bind(bus);
2764 r = bus_socket_process_opening(bus);
2767 case BUS_AUTHENTICATING:
2768 r = bus_socket_process_authenticating(bus);
2773 r = process_running(bus, hint_priority, priority, ret);
2777 /* This branch initializes *ret, hence we don't use the generic error checking below */
2781 return process_closing(bus, ret);
2784 assert_not_reached("Unknown state");
2787 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2788 bus_enter_closing(bus);
2799 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2800 return bus_process_internal(bus, false, 0, ret);
2803 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2804 return bus_process_internal(bus, true, priority, ret);
2807 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2808 struct pollfd p[2] = {};
2811 usec_t m = USEC_INFINITY;
2815 if (bus->state == BUS_CLOSING)
2818 if (!BUS_IS_OPEN(bus->state))
2821 if (bus->state == BUS_WATCH_BIND) {
2822 assert(bus->inotify_fd >= 0);
2824 p[0].events = POLLIN;
2825 p[0].fd = bus->inotify_fd;
2830 e = sd_bus_get_events(bus);
2835 /* The caller really needs some more data, he doesn't
2836 * care about what's already read, or any timeouts
2837 * except its own. */
2841 /* The caller wants to process if there's something to
2842 * process, but doesn't care otherwise */
2844 r = sd_bus_get_timeout(bus, &until);
2848 m = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
2851 p[0].fd = bus->input_fd;
2852 if (bus->output_fd == bus->input_fd) {
2856 p[0].events = e & POLLIN;
2857 p[1].fd = bus->output_fd;
2858 p[1].events = e & POLLOUT;
2863 if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
2866 r = ppoll(p, n, m == USEC_INFINITY ? NULL : timespec_store(&ts, m), NULL);
2870 return r > 0 ? 1 : 0;
2873 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2875 assert_return(bus, -EINVAL);
2876 assert_return(!bus_pid_changed(bus), -ECHILD);
2878 if (bus->state == BUS_CLOSING)
2881 if (!BUS_IS_OPEN(bus->state))
2884 if (bus->rqueue_size > 0)
2887 return bus_poll(bus, false, timeout_usec);
2890 _public_ int sd_bus_flush(sd_bus *bus) {
2893 assert_return(bus, -EINVAL);
2894 assert_return(!bus_pid_changed(bus), -ECHILD);
2896 if (bus->state == BUS_CLOSING)
2899 if (!BUS_IS_OPEN(bus->state))
2902 /* We never were connected? Don't hang in inotify for good, as there's no timeout set for it */
2903 if (bus->state == BUS_WATCH_BIND)
2906 r = bus_ensure_running(bus);
2910 if (bus->wqueue_size <= 0)
2914 r = dispatch_wqueue(bus);
2916 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2917 bus_enter_closing(bus);
2924 if (bus->wqueue_size <= 0)
2927 r = bus_poll(bus, false, (uint64_t) -1);
2933 _public_ int sd_bus_add_filter(
2936 sd_bus_message_handler_t callback,
2941 assert_return(bus, -EINVAL);
2942 assert_return(callback, -EINVAL);
2943 assert_return(!bus_pid_changed(bus), -ECHILD);
2945 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
2949 s->filter_callback.callback = callback;
2951 bus->filter_callbacks_modified = true;
2952 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
2960 static int add_match_callback(
2963 sd_bus_error *ret_error) {
2965 sd_bus_slot *match_slot = userdata;
2966 bool failed = false;
2972 sd_bus_slot_ref(match_slot);
2974 if (sd_bus_message_is_method_error(m, NULL)) {
2975 log_debug_errno(sd_bus_message_get_errno(m),
2976 "Unable to add match %s, failing connection: %s",
2977 match_slot->match_callback.match_string,
2978 sd_bus_message_get_error(m)->message);
2982 log_debug("Match %s successfully installed.", match_slot->match_callback.match_string);
2984 if (match_slot->match_callback.install_callback) {
2987 bus = sd_bus_message_get_bus(m);
2989 /* This function has been called as slot handler, and we want to call another slot handler. Let's
2990 * update the slot callback metadata temporarily with our own data, and then revert back to the old
2993 assert(bus->current_slot == match_slot->match_callback.install_slot);
2994 assert(bus->current_handler == add_match_callback);
2995 assert(bus->current_userdata == userdata);
2997 bus->current_slot = match_slot;
2998 bus->current_handler = match_slot->match_callback.install_callback;
2999 bus->current_userdata = match_slot->userdata;
3001 r = match_slot->match_callback.install_callback(m, match_slot->userdata, ret_error);
3003 bus->current_slot = match_slot->match_callback.install_slot;
3004 bus->current_handler = add_match_callback;
3005 bus->current_userdata = userdata;
3007 match_slot->match_callback.install_slot = sd_bus_slot_unref(match_slot->match_callback.install_slot);
3009 if (failed) /* Generic failure handling: destroy the connection */
3010 bus_enter_closing(sd_bus_message_get_bus(m));
3015 if (failed && match_slot->floating) {
3016 bus_slot_disconnect(match_slot);
3017 sd_bus_slot_unref(match_slot);
3020 sd_bus_slot_unref(match_slot);
3025 static int bus_add_match_full(
3030 sd_bus_message_handler_t callback,
3031 sd_bus_message_handler_t install_callback,
3034 struct bus_match_component *components = NULL;
3035 unsigned n_components = 0;
3036 sd_bus_slot *s = NULL;
3039 assert_return(bus, -EINVAL);
3040 assert_return(match, -EINVAL);
3041 assert_return(!bus_pid_changed(bus), -ECHILD);
3043 r = bus_match_parse(match, &components, &n_components);
3047 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
3053 s->match_callback.callback = callback;
3054 s->match_callback.install_callback = install_callback;
3056 if (bus->bus_client) {
3057 enum bus_match_scope scope;
3059 scope = bus_match_get_scope(components, n_components);
3061 /* Do not install server-side matches for matches against the local service, interface or bus path. */
3062 if (scope != BUS_MATCH_LOCAL) {
3064 /* We store the original match string, so that we can use it to remove the match again. */
3066 s->match_callback.match_string = strdup(match);
3067 if (!s->match_callback.match_string) {
3073 r = bus_add_match_internal_async(bus,
3074 &s->match_callback.install_slot,
3075 s->match_callback.match_string,
3079 r = bus_add_match_internal(bus, s->match_callback.match_string);
3083 s->match_added = true;
3087 bus->match_callbacks_modified = true;
3088 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3097 bus_match_parse_free(components, n_components);
3098 sd_bus_slot_unref(s);
3103 #if 0 /// UNNEEDED by elogind
3105 _public_ int sd_bus_add_match(
3109 sd_bus_message_handler_t callback,
3112 return bus_add_match_full(bus, slot, false, match, callback, NULL, userdata);
3115 _public_ int sd_bus_add_match_async(
3119 sd_bus_message_handler_t callback,
3120 sd_bus_message_handler_t install_callback,
3123 return bus_add_match_full(bus, slot, true, match, callback, install_callback, userdata);
3126 bool bus_pid_changed(sd_bus *bus) {
3129 /* We don't support people creating a bus connection and
3130 * keeping it around over a fork(). Let's complain. */
3132 return bus->original_pid != getpid_cached();
3135 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3136 sd_bus *bus = userdata;
3141 /* Note that this is called both on input_fd, output_fd as well as inotify_fd events */
3143 r = sd_bus_process(bus, NULL);
3145 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3146 bus_enter_closing(bus);
3152 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3153 sd_bus *bus = userdata;
3158 r = sd_bus_process(bus, NULL);
3160 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3161 bus_enter_closing(bus);
3167 static int prepare_callback(sd_event_source *s, void *userdata) {
3168 sd_bus *bus = userdata;
3175 e = sd_bus_get_events(bus);
3181 if (bus->output_fd != bus->input_fd) {
3183 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3187 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3189 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3193 r = sd_bus_get_timeout(bus, &until);
3199 j = sd_event_source_set_time(bus->time_event_source, until);
3206 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3213 log_debug_errno(r, "Preparing of bus events failed, closing down: %m");
3214 bus_enter_closing(bus);
3219 static int quit_callback(sd_event_source *event, void *userdata) {
3220 sd_bus *bus = userdata;
3230 int bus_attach_io_events(sd_bus *bus) {
3235 if (bus->input_fd < 0)
3241 if (!bus->input_io_event_source) {
3242 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3246 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3250 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3254 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3256 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3261 if (bus->output_fd != bus->input_fd) {
3262 assert(bus->output_fd >= 0);
3264 if (!bus->output_io_event_source) {
3265 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3269 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3273 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3275 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3284 static void bus_detach_io_events(sd_bus *bus) {
3287 if (bus->input_io_event_source) {
3288 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3289 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3292 if (bus->output_io_event_source) {
3293 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3294 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3298 int bus_attach_inotify_event(sd_bus *bus) {
3303 if (bus->inotify_fd < 0)
3309 if (!bus->inotify_event_source) {
3310 r = sd_event_add_io(bus->event, &bus->inotify_event_source, bus->inotify_fd, EPOLLIN, io_callback, bus);
3314 r = sd_event_source_set_priority(bus->inotify_event_source, bus->event_priority);
3318 r = sd_event_source_set_description(bus->inotify_event_source, "bus-inotify");
3320 r = sd_event_source_set_io_fd(bus->inotify_event_source, bus->inotify_fd);
3327 static void bus_detach_inotify_event(sd_bus *bus) {
3330 if (bus->inotify_event_source) {
3331 sd_event_source_set_enabled(bus->inotify_event_source, SD_EVENT_OFF);
3332 bus->inotify_event_source = sd_event_source_unref(bus->inotify_event_source);
3336 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3339 assert_return(bus, -EINVAL);
3340 assert_return(!bus->event, -EBUSY);
3342 assert(!bus->input_io_event_source);
3343 assert(!bus->output_io_event_source);
3344 assert(!bus->time_event_source);
3347 bus->event = sd_event_ref(event);
3349 r = sd_event_default(&bus->event);
3354 bus->event_priority = priority;
3356 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3360 r = sd_event_source_set_priority(bus->time_event_source, priority);
3364 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3368 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3372 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3376 r = bus_attach_io_events(bus);
3380 r = bus_attach_inotify_event(bus);
3387 sd_bus_detach_event(bus);
3391 _public_ int sd_bus_detach_event(sd_bus *bus) {
3392 assert_return(bus, -EINVAL);
3397 bus_detach_io_events(bus);
3398 bus_detach_inotify_event(bus);
3400 if (bus->time_event_source) {
3401 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3402 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3405 if (bus->quit_event_source) {
3406 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3407 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3410 bus->event = sd_event_unref(bus->event);
3414 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3415 assert_return(bus, NULL);
3420 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3421 assert_return(bus, NULL);
3423 return bus->current_message;
3426 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3427 assert_return(bus, NULL);
3429 return bus->current_slot;
3432 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3433 assert_return(bus, NULL);
3435 return bus->current_handler;
3438 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3439 assert_return(bus, NULL);
3441 return bus->current_userdata;
3444 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3449 assert(default_bus);
3452 return !!*default_bus;
3455 *ret = sd_bus_ref(*default_bus);
3463 b->default_bus_ptr = default_bus;
3471 _public_ int sd_bus_default_system(sd_bus **ret) {
3472 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3476 _public_ int sd_bus_default_user(sd_bus **ret) {
3477 #if 0 /// elogind does not support user buses
3478 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3480 return sd_bus_default_system(ret);
3484 _public_ int sd_bus_default(sd_bus **ret) {
3488 /* Let's try our best to reuse another cached connection. If
3489 * the starter bus type is set, connect via our normal
3490 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3491 * we can share the connection with the user/system default
3494 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3496 if (streq(e, "system"))
3497 return sd_bus_default_system(ret);
3498 #if 0 /// elogind does not support systemd units
3499 else if (STR_IN_SET(e, "user", "session"))
3500 return sd_bus_default_user(ret);
3504 /* No type is specified, so we have not other option than to
3505 * use the starter address if it is set. */
3506 e = secure_getenv("DBUS_STARTER_ADDRESS");
3508 return bus_default(sd_bus_open, &default_starter_bus, ret);
3510 /* Finally, if nothing is set use the cached connection for
3511 * the right scope */
3513 #if 0 /// elogind does not support systemd user instances
3514 if (cg_pid_get_owner_uid(0, NULL) >= 0)
3515 return sd_bus_default_user(ret);
3518 return sd_bus_default_system(ret);
3521 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3522 assert_return(b, -EINVAL);
3523 assert_return(tid, -EINVAL);
3524 assert_return(!bus_pid_changed(b), -ECHILD);
3532 return sd_event_get_tid(b->event, tid);
3537 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3538 _cleanup_free_ char *e = NULL;
3541 assert_return(object_path_is_valid(prefix), -EINVAL);
3542 assert_return(external_id, -EINVAL);
3543 assert_return(ret_path, -EINVAL);
3545 e = bus_label_escape(external_id);
3549 ret = strjoin(prefix, "/", e);
3557 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3561 assert_return(object_path_is_valid(path), -EINVAL);
3562 assert_return(object_path_is_valid(prefix), -EINVAL);
3563 assert_return(external_id, -EINVAL);
3565 e = object_path_startswith(path, prefix);
3567 *external_id = NULL;
3571 ret = bus_label_unescape(e);
3579 _public_ int sd_bus_path_encode_many(char **out, const char *path_template, ...) {
3580 _cleanup_strv_free_ char **labels = NULL;
3581 char *path, *path_pos, **label_pos;
3582 const char *sep, *template_pos;
3587 assert_return(out, -EINVAL);
3588 assert_return(path_template, -EINVAL);
3590 path_length = strlen(path_template);
3592 va_start(list, path_template);
3593 for (sep = strchr(path_template, '%'); sep; sep = strchr(sep + 1, '%')) {
3597 arg = va_arg(list, const char *);
3603 label = bus_label_escape(arg);
3609 r = strv_consume(&labels, label);
3615 /* add label length, but account for the format character */
3616 path_length += strlen(label) - 1;
3620 path = malloc(path_length + 1);
3627 for (template_pos = path_template; *template_pos; ) {
3628 sep = strchrnul(template_pos, '%');
3629 path_pos = mempcpy(path_pos, template_pos, sep - template_pos);
3633 path_pos = stpcpy(path_pos, *label_pos++);
3634 template_pos = sep + 1;
3642 _public_ int sd_bus_path_decode_many(const char *path, const char *path_template, ...) {
3643 _cleanup_strv_free_ char **labels = NULL;
3644 const char *template_pos, *path_pos;
3650 * This decodes an object-path based on a template argument. The
3651 * template consists of a verbatim path, optionally including special
3654 * - Each occurrence of '%' in the template matches an arbitrary
3655 * substring of a label in the given path. At most one such
3656 * directive is allowed per label. For each such directive, the
3657 * caller must provide an output parameter (char **) via va_arg. If
3658 * NULL is passed, the given label is verified, but not returned.
3659 * For each matched label, the *decoded* label is stored in the
3660 * passed output argument, and the caller is responsible to free
3661 * it. Note that the output arguments are only modified if the
3662 * actualy path matched the template. Otherwise, they're left
3665 * This function returns <0 on error, 0 if the path does not match the
3666 * template, 1 if it matched.
3669 assert_return(path, -EINVAL);
3670 assert_return(path_template, -EINVAL);
3674 for (template_pos = path_template; *template_pos; ) {
3679 /* verify everything until the next '%' matches verbatim */
3680 sep = strchrnul(template_pos, '%');
3681 length = sep - template_pos;
3682 if (strncmp(path_pos, template_pos, length))
3686 template_pos += length;
3691 /* We found the next '%' character. Everything up until here
3692 * matched. We now skip ahead to the end of this label and make
3693 * sure it matches the tail of the label in the path. Then we
3694 * decode the string in-between and save it for later use. */
3696 ++template_pos; /* skip over '%' */
3698 sep = strchrnul(template_pos, '/');
3699 length = sep - template_pos; /* length of suffix to match verbatim */
3701 /* verify the suffixes match */
3702 sep = strchrnul(path_pos, '/');
3703 if (sep - path_pos < (ssize_t)length ||
3704 strncmp(sep - length, template_pos, length))
3707 template_pos += length; /* skip over matched label */
3708 length = sep - path_pos - length; /* length of sub-label to decode */
3710 /* store unescaped label for later use */
3711 label = bus_label_unescape_n(path_pos, length);
3715 r = strv_consume(&labels, label);
3719 path_pos = sep; /* skip decoded label and suffix */
3722 /* end of template must match end of path */
3726 /* copy the labels over to the caller */
3727 va_start(list, path_template);
3728 for (label_pos = labels; label_pos && *label_pos; ++label_pos) {
3731 arg = va_arg(list, char **);
3739 labels = mfree(labels);
3743 _public_ int sd_bus_try_close(sd_bus *bus) {
3744 assert_return(bus, -EINVAL);
3745 assert_return(!bus_pid_changed(bus), -ECHILD);
3750 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3751 assert_return(bus, -EINVAL);
3752 assert_return(description, -EINVAL);
3753 assert_return(bus->description, -ENXIO);
3754 assert_return(!bus_pid_changed(bus), -ECHILD);
3756 *description = bus->description;
3760 int bus_get_root_path(sd_bus *bus) {
3763 if (bus->cgroup_root)
3766 r = cg_get_root_path(&bus->cgroup_root);
3768 bus->cgroup_root = strdup("/");
3769 if (!bus->cgroup_root)
3778 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3779 assert_return(bus, -EINVAL);
3780 assert_return(scope, -EINVAL);
3781 assert_return(!bus_pid_changed(bus), -ECHILD);
3788 if (bus->is_system) {
3796 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3798 assert_return(bus, -EINVAL);
3799 assert_return(address, -EINVAL);
3800 assert_return(!bus_pid_changed(bus), -ECHILD);
3803 *address = bus->address;
3810 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
3811 assert_return(bus, -EINVAL);
3812 assert_return(mask, -EINVAL);
3813 assert_return(!bus_pid_changed(bus), -ECHILD);
3815 *mask = bus->creds_mask;
3819 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
3820 assert_return(bus, -EINVAL);
3821 assert_return(!bus_pid_changed(bus), -ECHILD);
3823 return bus->bus_client;
3826 _public_ int sd_bus_is_server(sd_bus *bus) {
3827 assert_return(bus, -EINVAL);
3828 assert_return(!bus_pid_changed(bus), -ECHILD);
3830 return bus->is_server;
3833 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
3834 assert_return(bus, -EINVAL);
3835 assert_return(!bus_pid_changed(bus), -ECHILD);
3837 return bus->anonymous_auth;
3840 _public_ int sd_bus_is_trusted(sd_bus *bus) {
3841 assert_return(bus, -EINVAL);
3842 assert_return(!bus_pid_changed(bus), -ECHILD);
3844 return bus->trusted;
3847 _public_ int sd_bus_is_monitor(sd_bus *bus) {
3848 assert_return(bus, -EINVAL);
3849 assert_return(!bus_pid_changed(bus), -ECHILD);
3851 return bus->is_monitor;
3854 static void flush_close(sd_bus *bus) {
3858 /* Flushes and closes the specified bus. We take a ref before,
3859 * to ensure the flushing does not cause the bus to be
3862 sd_bus_flush_close_unref(sd_bus_ref(bus));
3865 _public_ void sd_bus_default_flush_close(void) {
3866 flush_close(default_starter_bus);
3867 #if 0 /// elogind does not support user buses
3868 flush_close(default_user_bus);
3870 flush_close(default_system_bus);
3873 _public_ int sd_bus_set_exit_on_disconnect(sd_bus *bus, int b) {
3874 assert_return(bus, -EINVAL);
3876 /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
3877 * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
3878 * from the client side. */
3879 bus->exit_on_disconnect = b;
3881 /* If the exit condition was triggered already, exit immediately. */
3882 return bus_exit_now(bus);
3885 _public_ int sd_bus_get_exit_on_disconnect(sd_bus *bus) {
3886 assert_return(bus, -EINVAL);
3888 return bus->exit_on_disconnect;