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_can_send(sd_bus *bus, char type) {
1417 assert_return(bus, -EINVAL);
1418 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1419 assert_return(!bus_pid_changed(bus), -ECHILD);
1421 if (bus->is_monitor)
1424 if (type == SD_BUS_TYPE_UNIX_FD) {
1425 if (!bus->accept_fd)
1428 r = bus_ensure_running(bus);
1432 return bus->can_fds;
1435 return bus_type_is_valid(type);
1438 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1441 assert_return(bus, -EINVAL);
1442 assert_return(id, -EINVAL);
1443 assert_return(!bus_pid_changed(bus), -ECHILD);
1445 r = bus_ensure_running(bus);
1449 *id = bus->server_id;
1453 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1458 /* If we copy the same message to multiple
1459 * destinations, avoid using the same cookie
1461 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1466 timeout = BUS_DEFAULT_TIMEOUT;
1468 return sd_bus_message_seal(m, ++b->cookie, timeout);
1471 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1472 bool remarshal = false;
1476 /* wrong packet version */
1477 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1480 /* wrong packet endianness */
1481 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1484 return remarshal ? bus_message_remarshal(b, m) : 0;
1487 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1491 /* Fake some timestamps, if they were requested, and not
1492 * already initialized */
1493 if (b->attach_timestamp) {
1494 if (m->realtime <= 0)
1495 m->realtime = now(CLOCK_REALTIME);
1497 if (m->monotonic <= 0)
1498 m->monotonic = now(CLOCK_MONOTONIC);
1501 /* The bus specification says the serial number cannot be 0,
1502 * hence let's fill something in for synthetic messages. Since
1503 * synthetic messages might have a fake sender and we don't
1504 * want to interfere with the real sender's serial numbers we
1505 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1506 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1507 * even though kdbus can do 64bit. */
1508 return sd_bus_message_seal(m, 0xFFFFFFFFULL, 0);
1511 static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
1517 r = bus_socket_write_message(bus, m, idx);
1521 if (*idx >= BUS_MESSAGE_SIZE(m))
1522 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",
1523 bus_message_type_to_string(m->header->type),
1524 strna(sd_bus_message_get_sender(m)),
1525 strna(sd_bus_message_get_destination(m)),
1526 strna(sd_bus_message_get_path(m)),
1527 strna(sd_bus_message_get_interface(m)),
1528 strna(sd_bus_message_get_member(m)),
1529 BUS_MESSAGE_COOKIE(m),
1531 strna(m->root_container.signature),
1532 strna(m->error.name),
1533 strna(m->error.message));
1538 static int dispatch_wqueue(sd_bus *bus) {
1542 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1544 while (bus->wqueue_size > 0) {
1546 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
1550 /* Didn't do anything this time */
1552 else if (bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1553 /* Fully written. Let's drop the entry from
1556 * This isn't particularly optimized, but
1557 * well, this is supposed to be our worst-case
1558 * buffer only, and the socket buffer is
1559 * supposed to be our primary buffer, and if
1560 * it got full, then all bets are off
1564 sd_bus_message_unref(bus->wqueue[0]);
1565 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1575 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1578 return bus_socket_read_message(bus);
1581 int bus_rqueue_make_room(sd_bus *bus) {
1584 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1587 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1593 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1598 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1600 /* Note that the priority logic is only available on kdbus,
1601 * where the rqueue is unused. We check the rqueue here
1602 * anyway, because it's simple... */
1605 if (bus->rqueue_size > 0) {
1606 /* Dispatch a queued message */
1608 *m = bus->rqueue[0];
1610 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1614 /* Try to read a new message */
1615 r = bus_read_message(bus, hint_priority, priority);
1625 static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
1626 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1629 assert_return(m, -EINVAL);
1634 assert_return(!bus_pid_changed(bus), -ECHILD);
1636 if (!BUS_IS_OPEN(bus->state))
1640 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1647 /* If the cookie number isn't kept, then we know that no reply
1649 if (!cookie && !m->sealed)
1650 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1652 r = bus_seal_message(bus, m, 0);
1656 /* Remarshall if we have to. This will possibly unref the
1657 * message and place a replacement in m */
1658 r = bus_remarshal_message(bus, &m);
1662 /* If this is a reply and no reply was requested, then let's
1663 * suppress this, if we can */
1667 if (IN_SET(bus->state, BUS_RUNNING, BUS_HELLO) && bus->wqueue_size <= 0) {
1670 r = bus_write_message(bus, m, hint_sync_call, &idx);
1672 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
1673 bus_enter_closing(bus);
1680 if (idx < BUS_MESSAGE_SIZE(m)) {
1681 /* Wasn't fully written. So let's remember how
1682 * much was written. Note that the first entry
1683 * of the wqueue array is always allocated so
1684 * that we always can remember how much was
1686 bus->wqueue[0] = sd_bus_message_ref(m);
1687 bus->wqueue_size = 1;
1692 /* Just append it to the queue. */
1694 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1697 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1700 bus->wqueue[bus->wqueue_size++] = sd_bus_message_ref(m);
1705 *cookie = BUS_MESSAGE_COOKIE(m);
1710 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1711 return bus_send_internal(bus, m, cookie, false);
1714 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1717 assert_return(m, -EINVAL);
1722 assert_return(!bus_pid_changed(bus), -ECHILD);
1724 if (!BUS_IS_OPEN(bus->state))
1727 if (!streq_ptr(m->destination, destination)) {
1732 r = sd_bus_message_set_destination(m, destination);
1737 return sd_bus_send(bus, m, cookie);
1740 static usec_t calc_elapse(sd_bus *bus, uint64_t usec) {
1743 if (usec == (uint64_t) -1)
1746 /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
1747 * with any connection setup states. Hence, if a method callback is started earlier than that we just store the
1748 * relative timestamp, and afterwards the absolute one. */
1750 if (IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING))
1753 return now(CLOCK_MONOTONIC) + usec;
1756 static int timeout_compare(const void *a, const void *b) {
1757 const struct reply_callback *x = a, *y = b;
1759 if (x->timeout_usec != 0 && y->timeout_usec == 0)
1762 if (x->timeout_usec == 0 && y->timeout_usec != 0)
1765 if (x->timeout_usec < y->timeout_usec)
1768 if (x->timeout_usec > y->timeout_usec)
1774 _public_ int sd_bus_call_async(
1778 sd_bus_message_handler_t callback,
1782 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1783 _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *s = NULL;
1786 assert_return(m, -EINVAL);
1787 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1788 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1789 assert_return(callback, -EINVAL);
1794 assert_return(!bus_pid_changed(bus), -ECHILD);
1796 if (!BUS_IS_OPEN(bus->state))
1799 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
1803 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1807 r = bus_seal_message(bus, m, usec);
1811 r = bus_remarshal_message(bus, &m);
1815 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
1819 s->reply_callback.callback = callback;
1821 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
1822 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
1824 s->reply_callback.cookie = 0;
1828 s->reply_callback.timeout_usec = calc_elapse(bus, m->timeout);
1829 if (s->reply_callback.timeout_usec != 0) {
1830 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
1832 s->reply_callback.timeout_usec = 0;
1837 r = sd_bus_send(bus, m, &s->reply_callback.cookie);
1848 int bus_ensure_running(sd_bus *bus) {
1853 if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
1855 if (bus->state == BUS_RUNNING)
1859 r = sd_bus_process(bus, NULL);
1862 if (bus->state == BUS_RUNNING)
1867 r = sd_bus_wait(bus, (uint64_t) -1);
1873 _public_ int sd_bus_call(
1877 sd_bus_error *error,
1878 sd_bus_message **reply) {
1880 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1886 bus_assert_return(m, -EINVAL, error);
1887 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
1888 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
1889 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
1894 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
1896 if (!BUS_IS_OPEN(bus->state)) {
1901 r = bus_ensure_running(bus);
1905 i = bus->rqueue_size;
1907 r = bus_seal_message(bus, m, usec);
1911 r = bus_remarshal_message(bus, &m);
1915 r = bus_send_internal(bus, m, &cookie, true);
1919 timeout = calc_elapse(bus, m->timeout);
1924 while (i < bus->rqueue_size) {
1925 sd_bus_message *incoming = NULL;
1927 incoming = bus->rqueue[i];
1929 if (incoming->reply_cookie == cookie) {
1930 /* Found a match! */
1932 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1934 log_debug_bus_message(incoming);
1936 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
1938 if (incoming->n_fds <= 0 || bus->accept_fd) {
1942 sd_bus_message_unref(incoming);
1947 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
1948 sd_bus_message_unref(incoming);
1951 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
1952 r = sd_bus_error_copy(error, &incoming->error);
1953 sd_bus_message_unref(incoming);
1960 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
1963 streq(bus->unique_name, incoming->sender)) {
1965 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1968 /* Our own message? Somebody is trying
1969 * to send its own client a message,
1970 * let's not dead-lock, let's fail
1973 sd_bus_message_unref(incoming);
1978 /* Try to read more, right-away */
1982 r = bus_read_message(bus, false, 0);
1984 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
1985 bus_enter_closing(bus);
1997 n = now(CLOCK_MONOTONIC);
2005 left = (uint64_t) -1;
2007 r = bus_poll(bus, true, left);
2015 r = dispatch_wqueue(bus);
2017 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2018 bus_enter_closing(bus);
2027 return sd_bus_error_set_errno(error, r);
2030 _public_ int sd_bus_get_fd(sd_bus *bus) {
2032 assert_return(bus, -EINVAL);
2033 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2034 assert_return(!bus_pid_changed(bus), -ECHILD);
2036 if (bus->state == BUS_CLOSED)
2039 if (bus->inotify_fd >= 0)
2040 return bus->inotify_fd;
2042 if (bus->input_fd >= 0)
2043 return bus->input_fd;
2048 _public_ int sd_bus_get_events(sd_bus *bus) {
2051 assert_return(bus, -EINVAL);
2052 assert_return(!bus_pid_changed(bus), -ECHILD);
2054 switch (bus->state) {
2060 case BUS_WATCH_BIND:
2068 case BUS_AUTHENTICATING:
2069 if (bus_socket_auth_needs_write(bus))
2077 if (bus->rqueue_size <= 0)
2079 if (bus->wqueue_size > 0)
2087 assert_not_reached("Unknown state");
2093 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2094 struct reply_callback *c;
2096 assert_return(bus, -EINVAL);
2097 assert_return(timeout_usec, -EINVAL);
2098 assert_return(!bus_pid_changed(bus), -ECHILD);
2100 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2103 if (bus->track_queue) {
2108 switch (bus->state) {
2110 case BUS_AUTHENTICATING:
2111 *timeout_usec = bus->auth_timeout;
2116 if (bus->rqueue_size > 0) {
2121 c = prioq_peek(bus->reply_callbacks_prioq);
2123 *timeout_usec = (uint64_t) -1;
2127 if (c->timeout_usec == 0) {
2128 *timeout_usec = (uint64_t) -1;
2132 *timeout_usec = c->timeout_usec;
2139 case BUS_WATCH_BIND:
2141 *timeout_usec = (uint64_t) -1;
2145 assert_not_reached("Unknown or unexpected stat");
2149 static int process_timeout(sd_bus *bus) {
2150 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2151 _cleanup_(sd_bus_message_unrefp) sd_bus_message* m = NULL;
2152 struct reply_callback *c;
2159 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2161 c = prioq_peek(bus->reply_callbacks_prioq);
2165 n = now(CLOCK_MONOTONIC);
2166 if (c->timeout_usec > n)
2169 r = bus_message_new_synthetic_error(
2172 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2177 r = bus_seal_synthetic_message(bus, m);
2181 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2182 c->timeout_usec = 0;
2184 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2187 slot = container_of(c, sd_bus_slot, reply_callback);
2189 bus->iteration_counter++;
2191 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2193 bus->current_message = m;
2194 bus->current_slot = sd_bus_slot_ref(slot);
2195 bus->current_handler = c->callback;
2196 bus->current_userdata = slot->userdata;
2197 r = c->callback(m, slot->userdata, &error_buffer);
2198 bus->current_userdata = NULL;
2199 bus->current_handler = NULL;
2200 bus->current_slot = NULL;
2201 bus->current_message = NULL;
2203 if (slot->floating) {
2204 bus_slot_disconnect(slot);
2205 sd_bus_slot_unref(slot);
2208 sd_bus_slot_unref(slot);
2210 /* When this is the hello message and it timed out, then make sure to propagate the error up, don't just log
2211 * and ignore the callback handler's return value. */
2215 return bus_maybe_reply_error(m, r, &error_buffer);
2218 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2222 if (bus->state != BUS_HELLO)
2225 /* Let's make sure the first message on the bus is the HELLO
2226 * reply. But note that we don't actually parse the message
2227 * here (we leave that to the usual handling), we just verify
2228 * we don't let any earlier msg through. */
2230 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2233 if (m->reply_cookie != 1)
2239 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2240 _cleanup_(sd_bus_message_unrefp) sd_bus_message *synthetic_reply = NULL;
2241 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2242 struct reply_callback *c;
2250 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2253 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2256 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2262 slot = container_of(c, sd_bus_slot, reply_callback);
2264 if (m->n_fds > 0 && !bus->accept_fd) {
2266 /* If the reply contained a file descriptor which we
2267 * didn't want we pass an error instead. */
2269 r = bus_message_new_synthetic_error(
2272 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2277 /* Copy over original timestamp */
2278 synthetic_reply->realtime = m->realtime;
2279 synthetic_reply->monotonic = m->monotonic;
2280 synthetic_reply->seqnum = m->seqnum;
2282 r = bus_seal_synthetic_message(bus, synthetic_reply);
2286 m = synthetic_reply;
2288 r = sd_bus_message_rewind(m, true);
2293 if (c->timeout_usec != 0) {
2294 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2295 c->timeout_usec = 0;
2298 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2300 bus->current_slot = sd_bus_slot_ref(slot);
2301 bus->current_handler = c->callback;
2302 bus->current_userdata = slot->userdata;
2303 r = c->callback(m, slot->userdata, &error_buffer);
2304 bus->current_userdata = NULL;
2305 bus->current_handler = NULL;
2306 bus->current_slot = NULL;
2308 if (slot->floating) {
2309 bus_slot_disconnect(slot);
2310 sd_bus_slot_unref(slot);
2313 sd_bus_slot_unref(slot);
2315 /* When this is the hello message and it failed, then make sure to propagate the error up, don't just log and
2316 * ignore the callback handler's return value. */
2320 return bus_maybe_reply_error(m, r, &error_buffer);
2323 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2324 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2325 struct filter_callback *l;
2332 bus->filter_callbacks_modified = false;
2334 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2337 if (bus->filter_callbacks_modified)
2340 /* Don't run this more than once per iteration */
2341 if (l->last_iteration == bus->iteration_counter)
2344 l->last_iteration = bus->iteration_counter;
2346 r = sd_bus_message_rewind(m, true);
2350 slot = container_of(l, sd_bus_slot, filter_callback);
2352 bus->current_slot = sd_bus_slot_ref(slot);
2353 bus->current_handler = l->callback;
2354 bus->current_userdata = slot->userdata;
2355 r = l->callback(m, slot->userdata, &error_buffer);
2356 bus->current_userdata = NULL;
2357 bus->current_handler = NULL;
2358 bus->current_slot = sd_bus_slot_unref(slot);
2360 r = bus_maybe_reply_error(m, r, &error_buffer);
2366 } while (bus->filter_callbacks_modified);
2371 static int process_match(sd_bus *bus, sd_bus_message *m) {
2378 bus->match_callbacks_modified = false;
2380 r = bus_match_run(bus, &bus->match_callbacks, m);
2384 } while (bus->match_callbacks_modified);
2389 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2390 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
2396 if (bus->is_monitor)
2399 if (bus->manual_peer_interface)
2402 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2405 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2408 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2411 if (streq_ptr(m->member, "Ping"))
2412 r = sd_bus_message_new_method_return(m, &reply);
2413 else if (streq_ptr(m->member, "GetMachineId")) {
2417 r = sd_id128_get_machine(&id);
2421 r = sd_bus_message_new_method_return(m, &reply);
2425 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2427 r = sd_bus_message_new_method_errorf(
2429 SD_BUS_ERROR_UNKNOWN_METHOD,
2430 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2436 r = sd_bus_send(bus, reply, NULL);
2443 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2447 /* If we got a message with a file descriptor which we didn't
2448 * want to accept, then let's drop it. How can this even
2449 * happen? For example, when the kernel queues a message into
2450 * an activatable names's queue which allows fds, and then is
2451 * delivered to us later even though we ourselves did not
2454 if (bus->is_monitor)
2463 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2464 return 1; /* just eat it up */
2466 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2469 static int process_message(sd_bus *bus, sd_bus_message *m) {
2475 bus->current_message = m;
2476 bus->iteration_counter++;
2478 log_debug_bus_message(m);
2480 r = process_hello(bus, m);
2484 r = process_reply(bus, m);
2488 r = process_fd_check(bus, m);
2492 r = process_filter(bus, m);
2496 r = process_match(bus, m);
2500 r = process_builtin(bus, m);
2504 r = bus_process_object(bus, m);
2507 bus->current_message = NULL;
2511 static int dispatch_track(sd_bus *bus) {
2514 if (!bus->track_queue)
2517 bus_track_dispatch(bus->track_queue);
2521 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2522 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2526 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2528 r = process_timeout(bus);
2532 r = dispatch_wqueue(bus);
2536 r = dispatch_track(bus);
2540 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2546 r = process_message(bus, m);
2551 r = sd_bus_message_rewind(m, true);
2560 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2562 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2563 strna(sd_bus_message_get_sender(m)),
2564 strna(sd_bus_message_get_path(m)),
2565 strna(sd_bus_message_get_interface(m)),
2566 strna(sd_bus_message_get_member(m)));
2568 r = sd_bus_reply_method_errorf(
2570 SD_BUS_ERROR_UNKNOWN_OBJECT,
2571 "Unknown object '%s'.", m->path);
2585 static int bus_exit_now(sd_bus *bus) {
2588 /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
2589 * sd_event_exit(), otherwise invokes libc exit(). */
2591 if (bus->exited) /* did we already exit? */
2593 if (!bus->exit_triggered) /* was the exit condition triggered? */
2595 if (!bus->exit_on_disconnect) /* Shall we actually exit on disconnection? */
2598 bus->exited = true; /* never exit more than once */
2600 log_debug("Bus connection disconnected, exiting.");
2603 return sd_event_exit(bus->event, EXIT_FAILURE);
2607 assert_not_reached("exit() didn't exit?");
2610 static int process_closing_reply_callback(sd_bus *bus, struct reply_callback *c) {
2611 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2612 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2619 r = bus_message_new_synthetic_error(
2622 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2627 r = bus_seal_synthetic_message(bus, m);
2631 if (c->timeout_usec != 0) {
2632 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2633 c->timeout_usec = 0;
2636 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2639 slot = container_of(c, sd_bus_slot, reply_callback);
2641 bus->iteration_counter++;
2643 bus->current_message = m;
2644 bus->current_slot = sd_bus_slot_ref(slot);
2645 bus->current_handler = c->callback;
2646 bus->current_userdata = slot->userdata;
2647 r = c->callback(m, slot->userdata, &error_buffer);
2648 bus->current_userdata = NULL;
2649 bus->current_handler = NULL;
2650 bus->current_slot = NULL;
2651 bus->current_message = NULL;
2653 if (slot->floating) {
2654 bus_slot_disconnect(slot);
2655 sd_bus_slot_unref(slot);
2658 sd_bus_slot_unref(slot);
2660 return bus_maybe_reply_error(m, r, &error_buffer);
2663 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2664 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2665 struct reply_callback *c;
2669 assert(bus->state == BUS_CLOSING);
2671 /* First, fail all outstanding method calls */
2672 c = ordered_hashmap_first(bus->reply_callbacks);
2674 return process_closing_reply_callback(bus, c);
2676 /* Then, fake-drop all remaining bus tracking references */
2678 bus_track_close(bus->tracks);
2682 /* Then, synthesize a Disconnected message */
2683 r = sd_bus_message_new_signal(
2686 "/org/freedesktop/DBus/Local",
2687 "org.freedesktop.DBus.Local",
2692 bus_message_set_sender_local(bus, m);
2694 r = bus_seal_synthetic_message(bus, m);
2700 bus->current_message = m;
2701 bus->iteration_counter++;
2703 r = process_filter(bus, m);
2707 r = process_match(bus, m);
2711 /* Nothing else to do, exit now, if the condition holds */
2712 bus->exit_triggered = true;
2713 (void) bus_exit_now(bus);
2723 bus->current_message = NULL;
2728 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2729 BUS_DONT_DESTROY(bus);
2732 /* Returns 0 when we didn't do anything. This should cause the
2733 * caller to invoke sd_bus_wait() before returning the next
2734 * time. Returns > 0 when we did something, which possibly
2735 * means *ret is filled in with an unprocessed message. */
2737 assert_return(bus, -EINVAL);
2738 assert_return(!bus_pid_changed(bus), -ECHILD);
2740 /* We don't allow recursively invoking sd_bus_process(). */
2741 assert_return(!bus->current_message, -EBUSY);
2742 assert(!bus->current_slot);
2744 switch (bus->state) {
2752 case BUS_WATCH_BIND:
2753 r = bus_socket_process_watch_bind(bus);
2757 r = bus_socket_process_opening(bus);
2760 case BUS_AUTHENTICATING:
2761 r = bus_socket_process_authenticating(bus);
2766 r = process_running(bus, hint_priority, priority, ret);
2770 /* This branch initializes *ret, hence we don't use the generic error checking below */
2774 return process_closing(bus, ret);
2777 assert_not_reached("Unknown state");
2780 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2781 bus_enter_closing(bus);
2792 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2793 return bus_process_internal(bus, false, 0, ret);
2796 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2797 return bus_process_internal(bus, true, priority, ret);
2800 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2801 struct pollfd p[2] = {};
2804 usec_t m = USEC_INFINITY;
2808 if (bus->state == BUS_CLOSING)
2811 if (!BUS_IS_OPEN(bus->state))
2814 if (bus->state == BUS_WATCH_BIND) {
2815 assert(bus->inotify_fd >= 0);
2817 p[0].events = POLLIN;
2818 p[0].fd = bus->inotify_fd;
2823 e = sd_bus_get_events(bus);
2828 /* The caller really needs some more data, he doesn't
2829 * care about what's already read, or any timeouts
2830 * except its own. */
2834 /* The caller wants to process if there's something to
2835 * process, but doesn't care otherwise */
2837 r = sd_bus_get_timeout(bus, &until);
2841 m = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
2844 p[0].fd = bus->input_fd;
2845 if (bus->output_fd == bus->input_fd) {
2849 p[0].events = e & POLLIN;
2850 p[1].fd = bus->output_fd;
2851 p[1].events = e & POLLOUT;
2856 if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
2859 r = ppoll(p, n, m == USEC_INFINITY ? NULL : timespec_store(&ts, m), NULL);
2863 return r > 0 ? 1 : 0;
2866 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2868 assert_return(bus, -EINVAL);
2869 assert_return(!bus_pid_changed(bus), -ECHILD);
2871 if (bus->state == BUS_CLOSING)
2874 if (!BUS_IS_OPEN(bus->state))
2877 if (bus->rqueue_size > 0)
2880 return bus_poll(bus, false, timeout_usec);
2883 _public_ int sd_bus_flush(sd_bus *bus) {
2886 assert_return(bus, -EINVAL);
2887 assert_return(!bus_pid_changed(bus), -ECHILD);
2889 if (bus->state == BUS_CLOSING)
2892 if (!BUS_IS_OPEN(bus->state))
2895 /* We never were connected? Don't hang in inotify for good, as there's no timeout set for it */
2896 if (bus->state == BUS_WATCH_BIND)
2899 r = bus_ensure_running(bus);
2903 if (bus->wqueue_size <= 0)
2907 r = dispatch_wqueue(bus);
2909 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2910 bus_enter_closing(bus);
2917 if (bus->wqueue_size <= 0)
2920 r = bus_poll(bus, false, (uint64_t) -1);
2926 _public_ int sd_bus_add_filter(
2929 sd_bus_message_handler_t callback,
2934 assert_return(bus, -EINVAL);
2935 assert_return(callback, -EINVAL);
2936 assert_return(!bus_pid_changed(bus), -ECHILD);
2938 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
2942 s->filter_callback.callback = callback;
2944 bus->filter_callbacks_modified = true;
2945 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
2953 static int add_match_callback(
2956 sd_bus_error *ret_error) {
2958 sd_bus_slot *match_slot = userdata;
2959 bool failed = false;
2965 sd_bus_slot_ref(match_slot);
2967 if (sd_bus_message_is_method_error(m, NULL)) {
2968 log_debug_errno(sd_bus_message_get_errno(m),
2969 "Unable to add match %s, failing connection: %s",
2970 match_slot->match_callback.match_string,
2971 sd_bus_message_get_error(m)->message);
2975 log_debug("Match %s successfully installed.", match_slot->match_callback.match_string);
2977 if (match_slot->match_callback.install_callback) {
2980 bus = sd_bus_message_get_bus(m);
2982 /* This function has been called as slot handler, and we want to call another slot handler. Let's
2983 * update the slot callback metadata temporarily with our own data, and then revert back to the old
2986 assert(bus->current_slot == match_slot->match_callback.install_slot);
2987 assert(bus->current_handler == add_match_callback);
2988 assert(bus->current_userdata == userdata);
2990 bus->current_slot = match_slot;
2991 bus->current_handler = match_slot->match_callback.install_callback;
2992 bus->current_userdata = match_slot->userdata;
2994 r = match_slot->match_callback.install_callback(m, match_slot->userdata, ret_error);
2996 bus->current_slot = match_slot->match_callback.install_slot;
2997 bus->current_handler = add_match_callback;
2998 bus->current_userdata = userdata;
3000 match_slot->match_callback.install_slot = sd_bus_slot_unref(match_slot->match_callback.install_slot);
3002 if (failed) /* Generic failure handling: destroy the connection */
3003 bus_enter_closing(sd_bus_message_get_bus(m));
3008 if (failed && match_slot->floating) {
3009 bus_slot_disconnect(match_slot);
3010 sd_bus_slot_unref(match_slot);
3013 sd_bus_slot_unref(match_slot);
3018 static int bus_add_match_full(
3023 sd_bus_message_handler_t callback,
3024 sd_bus_message_handler_t install_callback,
3027 struct bus_match_component *components = NULL;
3028 unsigned n_components = 0;
3029 sd_bus_slot *s = NULL;
3032 assert_return(bus, -EINVAL);
3033 assert_return(match, -EINVAL);
3034 assert_return(!bus_pid_changed(bus), -ECHILD);
3036 r = bus_match_parse(match, &components, &n_components);
3040 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
3046 s->match_callback.callback = callback;
3047 s->match_callback.install_callback = install_callback;
3049 if (bus->bus_client) {
3050 enum bus_match_scope scope;
3052 scope = bus_match_get_scope(components, n_components);
3054 /* Do not install server-side matches for matches against the local service, interface or bus path. */
3055 if (scope != BUS_MATCH_LOCAL) {
3057 /* We store the original match string, so that we can use it to remove the match again. */
3059 s->match_callback.match_string = strdup(match);
3060 if (!s->match_callback.match_string) {
3066 r = bus_add_match_internal_async(bus,
3067 &s->match_callback.install_slot,
3068 s->match_callback.match_string,
3072 r = bus_add_match_internal(bus, s->match_callback.match_string);
3076 s->match_added = true;
3080 bus->match_callbacks_modified = true;
3081 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3090 bus_match_parse_free(components, n_components);
3091 sd_bus_slot_unref(s);
3096 #if 0 /// UNNEEDED by elogind
3098 _public_ int sd_bus_add_match(
3102 sd_bus_message_handler_t callback,
3105 return bus_add_match_full(bus, slot, false, match, callback, NULL, userdata);
3108 _public_ int sd_bus_add_match_async(
3112 sd_bus_message_handler_t callback,
3113 sd_bus_message_handler_t install_callback,
3116 return bus_add_match_full(bus, slot, true, match, callback, install_callback, userdata);
3119 bool bus_pid_changed(sd_bus *bus) {
3122 /* We don't support people creating a bus connection and
3123 * keeping it around over a fork(). Let's complain. */
3125 return bus->original_pid != getpid_cached();
3128 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3129 sd_bus *bus = userdata;
3134 /* Note that this is called both on input_fd, output_fd as well as inotify_fd events */
3136 r = sd_bus_process(bus, NULL);
3138 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3139 bus_enter_closing(bus);
3145 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3146 sd_bus *bus = userdata;
3151 r = sd_bus_process(bus, NULL);
3153 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3154 bus_enter_closing(bus);
3160 static int prepare_callback(sd_event_source *s, void *userdata) {
3161 sd_bus *bus = userdata;
3168 e = sd_bus_get_events(bus);
3174 if (bus->output_fd != bus->input_fd) {
3176 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3180 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3182 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3186 r = sd_bus_get_timeout(bus, &until);
3192 j = sd_event_source_set_time(bus->time_event_source, until);
3199 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3206 log_debug_errno(r, "Preparing of bus events failed, closing down: %m");
3207 bus_enter_closing(bus);
3212 static int quit_callback(sd_event_source *event, void *userdata) {
3213 sd_bus *bus = userdata;
3223 int bus_attach_io_events(sd_bus *bus) {
3228 if (bus->input_fd < 0)
3234 if (!bus->input_io_event_source) {
3235 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3239 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3243 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3247 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3249 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3254 if (bus->output_fd != bus->input_fd) {
3255 assert(bus->output_fd >= 0);
3257 if (!bus->output_io_event_source) {
3258 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3262 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3266 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3268 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3277 static void bus_detach_io_events(sd_bus *bus) {
3280 if (bus->input_io_event_source) {
3281 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3282 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3285 if (bus->output_io_event_source) {
3286 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3287 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3291 int bus_attach_inotify_event(sd_bus *bus) {
3296 if (bus->inotify_fd < 0)
3302 if (!bus->inotify_event_source) {
3303 r = sd_event_add_io(bus->event, &bus->inotify_event_source, bus->inotify_fd, EPOLLIN, io_callback, bus);
3307 r = sd_event_source_set_priority(bus->inotify_event_source, bus->event_priority);
3311 r = sd_event_source_set_description(bus->inotify_event_source, "bus-inotify");
3313 r = sd_event_source_set_io_fd(bus->inotify_event_source, bus->inotify_fd);
3320 static void bus_detach_inotify_event(sd_bus *bus) {
3323 if (bus->inotify_event_source) {
3324 sd_event_source_set_enabled(bus->inotify_event_source, SD_EVENT_OFF);
3325 bus->inotify_event_source = sd_event_source_unref(bus->inotify_event_source);
3329 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3332 assert_return(bus, -EINVAL);
3333 assert_return(!bus->event, -EBUSY);
3335 assert(!bus->input_io_event_source);
3336 assert(!bus->output_io_event_source);
3337 assert(!bus->time_event_source);
3340 bus->event = sd_event_ref(event);
3342 r = sd_event_default(&bus->event);
3347 bus->event_priority = priority;
3349 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3353 r = sd_event_source_set_priority(bus->time_event_source, priority);
3357 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3361 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3365 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3369 r = bus_attach_io_events(bus);
3373 r = bus_attach_inotify_event(bus);
3380 sd_bus_detach_event(bus);
3384 _public_ int sd_bus_detach_event(sd_bus *bus) {
3385 assert_return(bus, -EINVAL);
3390 bus_detach_io_events(bus);
3391 bus_detach_inotify_event(bus);
3393 if (bus->time_event_source) {
3394 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3395 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3398 if (bus->quit_event_source) {
3399 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3400 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3403 bus->event = sd_event_unref(bus->event);
3407 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3408 assert_return(bus, NULL);
3413 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3414 assert_return(bus, NULL);
3416 return bus->current_message;
3419 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3420 assert_return(bus, NULL);
3422 return bus->current_slot;
3425 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3426 assert_return(bus, NULL);
3428 return bus->current_handler;
3431 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3432 assert_return(bus, NULL);
3434 return bus->current_userdata;
3437 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3442 assert(default_bus);
3445 return !!*default_bus;
3448 *ret = sd_bus_ref(*default_bus);
3456 b->default_bus_ptr = default_bus;
3464 _public_ int sd_bus_default_system(sd_bus **ret) {
3465 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3469 _public_ int sd_bus_default_user(sd_bus **ret) {
3470 #if 0 /// elogind does not support user buses
3471 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3473 return sd_bus_default_system(ret);
3477 _public_ int sd_bus_default(sd_bus **ret) {
3481 /* Let's try our best to reuse another cached connection. If
3482 * the starter bus type is set, connect via our normal
3483 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3484 * we can share the connection with the user/system default
3487 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3489 if (streq(e, "system"))
3490 return sd_bus_default_system(ret);
3491 #if 0 /// elogind does not support systemd units
3492 else if (STR_IN_SET(e, "user", "session"))
3493 return sd_bus_default_user(ret);
3497 /* No type is specified, so we have not other option than to
3498 * use the starter address if it is set. */
3499 e = secure_getenv("DBUS_STARTER_ADDRESS");
3501 return bus_default(sd_bus_open, &default_starter_bus, ret);
3503 /* Finally, if nothing is set use the cached connection for
3504 * the right scope */
3506 #if 0 /// elogind does not support systemd user instances
3507 if (cg_pid_get_owner_uid(0, NULL) >= 0)
3508 return sd_bus_default_user(ret);
3511 return sd_bus_default_system(ret);
3514 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3515 assert_return(b, -EINVAL);
3516 assert_return(tid, -EINVAL);
3517 assert_return(!bus_pid_changed(b), -ECHILD);
3525 return sd_event_get_tid(b->event, tid);
3530 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3531 _cleanup_free_ char *e = NULL;
3534 assert_return(object_path_is_valid(prefix), -EINVAL);
3535 assert_return(external_id, -EINVAL);
3536 assert_return(ret_path, -EINVAL);
3538 e = bus_label_escape(external_id);
3542 ret = strjoin(prefix, "/", e);
3550 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3554 assert_return(object_path_is_valid(path), -EINVAL);
3555 assert_return(object_path_is_valid(prefix), -EINVAL);
3556 assert_return(external_id, -EINVAL);
3558 e = object_path_startswith(path, prefix);
3560 *external_id = NULL;
3564 ret = bus_label_unescape(e);
3572 _public_ int sd_bus_path_encode_many(char **out, const char *path_template, ...) {
3573 _cleanup_strv_free_ char **labels = NULL;
3574 char *path, *path_pos, **label_pos;
3575 const char *sep, *template_pos;
3580 assert_return(out, -EINVAL);
3581 assert_return(path_template, -EINVAL);
3583 path_length = strlen(path_template);
3585 va_start(list, path_template);
3586 for (sep = strchr(path_template, '%'); sep; sep = strchr(sep + 1, '%')) {
3590 arg = va_arg(list, const char *);
3596 label = bus_label_escape(arg);
3602 r = strv_consume(&labels, label);
3608 /* add label length, but account for the format character */
3609 path_length += strlen(label) - 1;
3613 path = malloc(path_length + 1);
3620 for (template_pos = path_template; *template_pos; ) {
3621 sep = strchrnul(template_pos, '%');
3622 path_pos = mempcpy(path_pos, template_pos, sep - template_pos);
3626 path_pos = stpcpy(path_pos, *label_pos++);
3627 template_pos = sep + 1;
3635 _public_ int sd_bus_path_decode_many(const char *path, const char *path_template, ...) {
3636 _cleanup_strv_free_ char **labels = NULL;
3637 const char *template_pos, *path_pos;
3643 * This decodes an object-path based on a template argument. The
3644 * template consists of a verbatim path, optionally including special
3647 * - Each occurrence of '%' in the template matches an arbitrary
3648 * substring of a label in the given path. At most one such
3649 * directive is allowed per label. For each such directive, the
3650 * caller must provide an output parameter (char **) via va_arg. If
3651 * NULL is passed, the given label is verified, but not returned.
3652 * For each matched label, the *decoded* label is stored in the
3653 * passed output argument, and the caller is responsible to free
3654 * it. Note that the output arguments are only modified if the
3655 * actualy path matched the template. Otherwise, they're left
3658 * This function returns <0 on error, 0 if the path does not match the
3659 * template, 1 if it matched.
3662 assert_return(path, -EINVAL);
3663 assert_return(path_template, -EINVAL);
3667 for (template_pos = path_template; *template_pos; ) {
3672 /* verify everything until the next '%' matches verbatim */
3673 sep = strchrnul(template_pos, '%');
3674 length = sep - template_pos;
3675 if (strncmp(path_pos, template_pos, length))
3679 template_pos += length;
3684 /* We found the next '%' character. Everything up until here
3685 * matched. We now skip ahead to the end of this label and make
3686 * sure it matches the tail of the label in the path. Then we
3687 * decode the string in-between and save it for later use. */
3689 ++template_pos; /* skip over '%' */
3691 sep = strchrnul(template_pos, '/');
3692 length = sep - template_pos; /* length of suffix to match verbatim */
3694 /* verify the suffixes match */
3695 sep = strchrnul(path_pos, '/');
3696 if (sep - path_pos < (ssize_t)length ||
3697 strncmp(sep - length, template_pos, length))
3700 template_pos += length; /* skip over matched label */
3701 length = sep - path_pos - length; /* length of sub-label to decode */
3703 /* store unescaped label for later use */
3704 label = bus_label_unescape_n(path_pos, length);
3708 r = strv_consume(&labels, label);
3712 path_pos = sep; /* skip decoded label and suffix */
3715 /* end of template must match end of path */
3719 /* copy the labels over to the caller */
3720 va_start(list, path_template);
3721 for (label_pos = labels; label_pos && *label_pos; ++label_pos) {
3724 arg = va_arg(list, char **);
3732 labels = mfree(labels);
3736 _public_ int sd_bus_try_close(sd_bus *bus) {
3737 assert_return(bus, -EINVAL);
3738 assert_return(!bus_pid_changed(bus), -ECHILD);
3743 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3744 assert_return(bus, -EINVAL);
3745 assert_return(description, -EINVAL);
3746 assert_return(bus->description, -ENXIO);
3747 assert_return(!bus_pid_changed(bus), -ECHILD);
3749 *description = bus->description;
3753 int bus_get_root_path(sd_bus *bus) {
3756 if (bus->cgroup_root)
3759 r = cg_get_root_path(&bus->cgroup_root);
3761 bus->cgroup_root = strdup("/");
3762 if (!bus->cgroup_root)
3771 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3772 assert_return(bus, -EINVAL);
3773 assert_return(scope, -EINVAL);
3774 assert_return(!bus_pid_changed(bus), -ECHILD);
3781 if (bus->is_system) {
3789 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3791 assert_return(bus, -EINVAL);
3792 assert_return(address, -EINVAL);
3793 assert_return(!bus_pid_changed(bus), -ECHILD);
3796 *address = bus->address;
3803 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
3804 assert_return(bus, -EINVAL);
3805 assert_return(mask, -EINVAL);
3806 assert_return(!bus_pid_changed(bus), -ECHILD);
3808 *mask = bus->creds_mask;
3812 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
3813 assert_return(bus, -EINVAL);
3814 assert_return(!bus_pid_changed(bus), -ECHILD);
3816 return bus->bus_client;
3819 _public_ int sd_bus_is_server(sd_bus *bus) {
3820 assert_return(bus, -EINVAL);
3821 assert_return(!bus_pid_changed(bus), -ECHILD);
3823 return bus->is_server;
3826 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
3827 assert_return(bus, -EINVAL);
3828 assert_return(!bus_pid_changed(bus), -ECHILD);
3830 return bus->anonymous_auth;
3833 _public_ int sd_bus_is_trusted(sd_bus *bus) {
3834 assert_return(bus, -EINVAL);
3835 assert_return(!bus_pid_changed(bus), -ECHILD);
3837 return bus->trusted;
3840 _public_ int sd_bus_is_monitor(sd_bus *bus) {
3841 assert_return(bus, -EINVAL);
3842 assert_return(!bus_pid_changed(bus), -ECHILD);
3844 return bus->is_monitor;
3847 static void flush_close(sd_bus *bus) {
3851 /* Flushes and closes the specified bus. We take a ref before,
3852 * to ensure the flushing does not cause the bus to be
3855 sd_bus_flush_close_unref(sd_bus_ref(bus));
3858 _public_ void sd_bus_default_flush_close(void) {
3859 flush_close(default_starter_bus);
3860 #if 0 /// elogind does not support user buses
3861 flush_close(default_user_bus);
3863 flush_close(default_system_bus);
3866 _public_ int sd_bus_set_exit_on_disconnect(sd_bus *bus, int b) {
3867 assert_return(bus, -EINVAL);
3869 /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
3870 * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
3871 * from the client side. */
3872 bus->exit_on_disconnect = b;
3874 /* If the exit condition was triggered already, exit immediately. */
3875 return bus_exit_now(bus);
3878 _public_ int sd_bus_get_exit_on_disconnect(sd_bus *bus) {
3879 assert_return(bus, -EINVAL);
3881 return bus->exit_on_disconnect;