1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
35 #include "cgroup-util.h"
36 #include "hostname-util.h"
37 #include "bus-label.h"
40 #include "bus-internal.h"
41 #include "bus-message.h"
43 #include "bus-socket.h"
44 #include "bus-kernel.h"
45 #include "bus-control.h"
46 #include "bus-objects.h"
48 #include "bus-container.h"
49 #include "bus-protocol.h"
50 #include "bus-track.h"
53 #define log_debug_bus_message(m) \
55 sd_bus_message *_mm = (m); \
56 log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s", \
57 bus_message_type_to_string(_mm->header->type), \
58 strna(sd_bus_message_get_sender(_mm)), \
59 strna(sd_bus_message_get_destination(_mm)), \
60 strna(sd_bus_message_get_path(_mm)), \
61 strna(sd_bus_message_get_interface(_mm)), \
62 strna(sd_bus_message_get_member(_mm)), \
63 BUS_MESSAGE_COOKIE(_mm), \
65 strna(_mm->error.message)); \
68 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
69 static int attach_io_events(sd_bus *b);
70 static void detach_io_events(sd_bus *b);
72 static void bus_close_fds(sd_bus *b) {
77 if (b->input_fd != b->output_fd)
78 safe_close(b->output_fd);
79 b->output_fd = b->input_fd = safe_close(b->input_fd);
82 static void bus_reset_queues(sd_bus *b) {
85 while (b->rqueue_size > 0)
86 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
88 b->rqueue = mfree(b->rqueue);
89 b->rqueue_allocated = 0;
91 while (b->wqueue_size > 0)
92 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
94 b->wqueue = mfree(b->wqueue);
95 b->wqueue_allocated = 0;
98 static void bus_free(sd_bus *b) {
102 assert(!b->track_queue);
104 b->state = BUS_CLOSED;
106 sd_bus_detach_event(b);
108 while ((s = b->slots)) {
109 /* At this point only floating slots can still be
110 * around, because the non-floating ones keep a
111 * reference to the bus, and we thus couldn't be
112 * destructing right now... We forcibly disconnect the
113 * slots here, so that they still can be referenced by
114 * apps, but are dead. */
117 bus_slot_disconnect(s);
118 sd_bus_slot_unref(s);
121 if (b->default_bus_ptr)
122 *b->default_bus_ptr = NULL;
127 munmap(b->kdbus_buffer, KDBUS_POOL_SIZE);
131 free(b->unique_name);
132 free(b->auth_buffer);
137 free(b->cgroup_root);
138 free(b->description);
141 strv_free(b->exec_argv);
143 close_many(b->fds, b->n_fds);
148 ordered_hashmap_free_free(b->reply_callbacks);
149 prioq_free(b->reply_callbacks_prioq);
151 assert(b->match_callbacks.type == BUS_MATCH_ROOT);
152 bus_match_free(&b->match_callbacks);
154 hashmap_free_free(b->vtable_methods);
155 hashmap_free_free(b->vtable_properties);
157 assert(hashmap_isempty(b->nodes));
158 hashmap_free(b->nodes);
160 bus_kernel_flush_memfd(b);
162 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
167 _public_ int sd_bus_new(sd_bus **ret) {
170 assert_return(ret, -EINVAL);
176 r->n_ref = REFCNT_INIT;
177 r->input_fd = r->output_fd = -1;
178 r->message_version = 1;
179 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
180 r->hello_flags |= KDBUS_HELLO_ACCEPT_FD;
181 r->attach_flags |= KDBUS_ATTACH_NAMES;
182 r->original_pid = getpid();
184 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
186 /* We guarantee that wqueue always has space for at least one
188 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
197 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
200 assert_return(bus, -EINVAL);
201 assert_return(bus->state == BUS_UNSET, -EPERM);
202 assert_return(address, -EINVAL);
203 assert_return(!bus_pid_changed(bus), -ECHILD);
215 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
216 assert_return(bus, -EINVAL);
217 assert_return(bus->state == BUS_UNSET, -EPERM);
218 assert_return(input_fd >= 0, -EBADF);
219 assert_return(output_fd >= 0, -EBADF);
220 assert_return(!bus_pid_changed(bus), -ECHILD);
222 bus->input_fd = input_fd;
223 bus->output_fd = output_fd;
227 /// UNNEEDED by elogind
229 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
232 assert_return(bus, -EINVAL);
233 assert_return(bus->state == BUS_UNSET, -EPERM);
234 assert_return(path, -EINVAL);
235 assert_return(!strv_isempty(argv), -EINVAL);
236 assert_return(!bus_pid_changed(bus), -ECHILD);
248 free(bus->exec_path);
249 strv_free(bus->exec_argv);
257 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
258 assert_return(bus, -EINVAL);
259 assert_return(bus->state == BUS_UNSET, -EPERM);
260 assert_return(!bus_pid_changed(bus), -ECHILD);
262 bus->bus_client = !!b;
266 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
267 assert_return(bus, -EINVAL);
268 assert_return(bus->state == BUS_UNSET, -EPERM);
269 assert_return(!bus_pid_changed(bus), -ECHILD);
271 SET_FLAG(bus->hello_flags, KDBUS_HELLO_MONITOR, b);
275 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
276 assert_return(bus, -EINVAL);
277 assert_return(bus->state == BUS_UNSET, -EPERM);
278 assert_return(!bus_pid_changed(bus), -ECHILD);
280 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ACCEPT_FD, b);
284 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
286 assert_return(bus, -EINVAL);
287 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
288 assert_return(!bus_pid_changed(bus), -ECHILD);
290 new_flags = bus->attach_flags;
291 SET_FLAG(new_flags, KDBUS_ATTACH_TIMESTAMP, b);
293 if (bus->attach_flags == new_flags)
296 bus->attach_flags = new_flags;
297 if (bus->state != BUS_UNSET && bus->is_kernel)
298 bus_kernel_realize_attach_flags(bus);
304 _public_ int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t mask) {
307 assert_return(bus, -EINVAL);
308 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
309 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
310 assert_return(!bus_pid_changed(bus), -ECHILD);
313 bus->creds_mask |= mask;
315 bus->creds_mask &= ~mask;
317 /* The well knowns we need unconditionally, so that matches can work */
318 bus->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
320 /* Make sure we don't lose the timestamp flag */
321 new_flags = (bus->attach_flags & KDBUS_ATTACH_TIMESTAMP) | attach_flags_to_kdbus(bus->creds_mask);
322 if (bus->attach_flags == new_flags)
325 bus->attach_flags = new_flags;
326 if (bus->state != BUS_UNSET && bus->is_kernel)
327 bus_kernel_realize_attach_flags(bus);
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 /// UNNEEDED by elogind
345 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
346 assert_return(bus, -EINVAL);
347 assert_return(bus->state == BUS_UNSET, -EPERM);
348 assert_return(!bus_pid_changed(bus), -ECHILD);
350 bus->anonymous_auth = !!b;
354 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
355 assert_return(bus, -EINVAL);
356 assert_return(bus->state == BUS_UNSET, -EPERM);
357 assert_return(!bus_pid_changed(bus), -ECHILD);
363 _public_ int sd_bus_set_description(sd_bus *bus, const char *description) {
364 assert_return(bus, -EINVAL);
365 assert_return(bus->state == BUS_UNSET, -EPERM);
366 assert_return(!bus_pid_changed(bus), -ECHILD);
368 return free_and_strdup(&bus->description, description);
372 _public_ int sd_bus_set_allow_interactive_authorization(sd_bus *bus, int b) {
373 assert_return(bus, -EINVAL);
374 assert_return(!bus_pid_changed(bus), -ECHILD);
376 bus->allow_interactive_authorization = !!b;
380 /// UNNEEDED by elogind
382 _public_ int sd_bus_get_allow_interactive_authorization(sd_bus *bus) {
383 assert_return(bus, -EINVAL);
384 assert_return(!bus_pid_changed(bus), -ECHILD);
386 return bus->allow_interactive_authorization;
390 static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) {
398 assert(bus->state == BUS_HELLO || bus->state == BUS_CLOSING);
400 r = sd_bus_message_get_errno(reply);
404 r = sd_bus_message_read(reply, "s", &s);
408 if (!service_name_is_valid(s) || s[0] != ':')
411 bus->unique_name = strdup(s);
412 if (!bus->unique_name)
415 if (bus->state == BUS_HELLO)
416 bus->state = BUS_RUNNING;
421 static int bus_send_hello(sd_bus *bus) {
422 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
427 if (!bus->bus_client || bus->is_kernel)
430 r = sd_bus_message_new_method_call(
433 "org.freedesktop.DBus",
434 "/org/freedesktop/DBus",
435 "org.freedesktop.DBus",
440 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
443 int bus_start_running(sd_bus *bus) {
446 if (bus->bus_client && !bus->is_kernel) {
447 bus->state = BUS_HELLO;
451 bus->state = BUS_RUNNING;
455 static int parse_address_key(const char **p, const char *key, char **value) {
456 size_t l, n = 0, allocated = 0;
466 if (strncmp(*p, key, l) != 0)
479 while (*a != ';' && *a != ',' && *a != 0) {
497 c = (char) ((x << 4) | y);
504 if (!GREEDY_REALLOC(r, allocated, n + 2))
528 static void skip_address_key(const char **p) {
532 *p += strcspn(*p, ",");
538 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
539 _cleanup_free_ char *path = NULL, *abstract = NULL;
548 while (**p != 0 && **p != ';') {
549 r = parse_address_key(p, "guid", guid);
555 r = parse_address_key(p, "path", &path);
561 r = parse_address_key(p, "abstract", &abstract);
570 if (!path && !abstract)
573 if (path && abstract)
578 if (l > sizeof(b->sockaddr.un.sun_path))
581 b->sockaddr.un.sun_family = AF_UNIX;
582 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
583 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
584 } else if (abstract) {
585 l = strlen(abstract);
586 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
589 b->sockaddr.un.sun_family = AF_UNIX;
590 b->sockaddr.un.sun_path[0] = 0;
591 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
592 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
598 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
599 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
601 struct addrinfo *result, hints = {
602 .ai_socktype = SOCK_STREAM,
603 .ai_flags = AI_ADDRCONFIG,
611 while (**p != 0 && **p != ';') {
612 r = parse_address_key(p, "guid", guid);
618 r = parse_address_key(p, "host", &host);
624 r = parse_address_key(p, "port", &port);
630 r = parse_address_key(p, "family", &family);
643 if (streq(family, "ipv4"))
644 hints.ai_family = AF_INET;
645 else if (streq(family, "ipv6"))
646 hints.ai_family = AF_INET6;
651 r = getaddrinfo(host, port, &hints, &result);
655 return -EADDRNOTAVAIL;
657 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
658 b->sockaddr_size = result->ai_addrlen;
660 freeaddrinfo(result);
665 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
667 unsigned n_argv = 0, j;
669 size_t allocated = 0;
677 while (**p != 0 && **p != ';') {
678 r = parse_address_key(p, "guid", guid);
684 r = parse_address_key(p, "path", &path);
690 if (startswith(*p, "argv")) {
694 ul = strtoul(*p + 4, (char**) p, 10);
695 if (errno > 0 || **p != '=' || ul > 256) {
703 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
711 r = parse_address_key(p, NULL, argv + ul);
726 /* Make sure there are no holes in the array, with the
727 * exception of argv[0] */
728 for (j = 1; j < n_argv; j++)
734 if (argv && argv[0] == NULL) {
735 argv[0] = strdup(path);
747 for (j = 0; j < n_argv; j++)
755 static int parse_kernel_address(sd_bus *b, const char **p, char **guid) {
756 _cleanup_free_ char *path = NULL;
764 while (**p != 0 && **p != ';') {
765 r = parse_address_key(p, "guid", guid);
771 r = parse_address_key(p, "path", &path);
790 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
791 _cleanup_free_ char *machine = NULL, *pid = NULL;
799 while (**p != 0 && **p != ';') {
800 r = parse_address_key(p, "guid", guid);
806 r = parse_address_key(p, "machine", &machine);
812 r = parse_address_key(p, "pid", &pid);
821 if (!machine == !pid)
825 if (!machine_name_is_valid(machine))
829 b->machine = machine;
832 b->machine = mfree(b->machine);
836 r = parse_pid(pid, &b->nspid);
842 b->sockaddr.un.sun_family = AF_UNIX;
843 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
844 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + strlen("/var/run/dbus/system_bus_socket");
849 static int parse_container_kernel_address(sd_bus *b, const char **p, char **guid) {
850 _cleanup_free_ char *machine = NULL, *pid = NULL;
858 while (**p != 0 && **p != ';') {
859 r = parse_address_key(p, "guid", guid);
865 r = parse_address_key(p, "machine", &machine);
871 r = parse_address_key(p, "pid", &pid);
880 if (!machine == !pid)
884 if (!machine_name_is_valid(machine))
888 b->machine = machine;
891 b->machine = mfree(b->machine);
895 r = parse_pid(pid, &b->nspid);
901 r = free_and_strdup(&b->kernel, "/sys/fs/kdbus/0-system/bus");
908 static void bus_reset_parsed_address(sd_bus *b) {
912 b->sockaddr_size = 0;
913 b->exec_argv = strv_free(b->exec_argv);
914 b->exec_path = mfree(b->exec_path);
915 b->server_id = SD_ID128_NULL;
916 b->kernel = mfree(b->kernel);
917 b->machine = mfree(b->machine);
921 static int bus_parse_next_address(sd_bus *b) {
922 _cleanup_free_ char *guid = NULL;
930 if (b->address[b->address_index] == 0)
933 bus_reset_parsed_address(b);
935 a = b->address + b->address_index;
944 if (startswith(a, "unix:")) {
947 r = parse_unix_address(b, &a, &guid);
952 } else if (startswith(a, "tcp:")) {
955 r = parse_tcp_address(b, &a, &guid);
961 } else if (startswith(a, "unixexec:")) {
964 r = parse_exec_address(b, &a, &guid);
970 } else if (startswith(a, "kernel:")) {
973 r = parse_kernel_address(b, &a, &guid);
978 } else if (startswith(a, "x-machine-unix:")) {
981 r = parse_container_unix_address(b, &a, &guid);
986 } else if (startswith(a, "x-machine-kernel:")) {
989 r = parse_container_kernel_address(b, &a, &guid);
1002 r = sd_id128_from_string(guid, &b->server_id);
1007 b->address_index = a - b->address;
1011 static int bus_start_address(sd_bus *b) {
1012 bool container_kdbus_available = false;
1013 bool kdbus_available = false;
1019 bool skipped = false;
1024 * Usually, if you provide multiple different bus-addresses, we
1025 * try all of them in order. We use the first one that
1026 * succeeds. However, if you mix kernel and unix addresses, we
1027 * never try unix-addresses if a previous kernel address was
1028 * tried and kdbus was available. This is required to prevent
1029 * clients to fallback to the bus-proxy if kdbus is available
1030 * but failed (eg., too many connections).
1034 r = bus_socket_exec(b);
1035 else if ((b->nspid > 0 || b->machine) && b->kernel) {
1036 r = bus_container_connect_kernel(b);
1037 if (r < 0 && !IN_SET(r, -ENOENT, -ESOCKTNOSUPPORT))
1038 container_kdbus_available = true;
1040 } else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC) {
1041 if (!container_kdbus_available)
1042 r = bus_container_connect_socket(b);
1046 } else if (b->kernel) {
1047 r = bus_kernel_connect(b);
1048 if (r < 0 && !IN_SET(r, -ENOENT, -ESOCKTNOSUPPORT))
1049 kdbus_available = true;
1051 } else if (b->sockaddr.sa.sa_family != AF_UNSPEC) {
1052 if (!kdbus_available)
1053 r = bus_socket_connect(b);
1061 r = attach_io_events(b);
1066 b->last_connect_error = -r;
1069 r = bus_parse_next_address(b);
1073 return b->last_connect_error ? -b->last_connect_error : -ECONNREFUSED;
1077 int bus_next_address(sd_bus *b) {
1080 bus_reset_parsed_address(b);
1081 return bus_start_address(b);
1084 static int bus_start_fd(sd_bus *b) {
1089 assert(b->input_fd >= 0);
1090 assert(b->output_fd >= 0);
1092 r = fd_nonblock(b->input_fd, true);
1096 r = fd_cloexec(b->input_fd, true);
1100 if (b->input_fd != b->output_fd) {
1101 r = fd_nonblock(b->output_fd, true);
1105 r = fd_cloexec(b->output_fd, true);
1110 if (fstat(b->input_fd, &st) < 0)
1113 if (S_ISCHR(b->input_fd))
1114 return bus_kernel_take_fd(b);
1116 return bus_socket_take_fd(b);
1119 _public_ int sd_bus_start(sd_bus *bus) {
1122 assert_return(bus, -EINVAL);
1123 assert_return(bus->state == BUS_UNSET, -EPERM);
1124 assert_return(!bus_pid_changed(bus), -ECHILD);
1126 bus->state = BUS_OPENING;
1128 if (bus->is_server && bus->bus_client)
1131 if (bus->input_fd >= 0)
1132 r = bus_start_fd(bus);
1133 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->kernel || bus->machine)
1134 r = bus_start_address(bus);
1143 return bus_send_hello(bus);
1146 _public_ int sd_bus_open(sd_bus **ret) {
1151 assert_return(ret, -EINVAL);
1153 /* Let's connect to the starter bus if it is set, and
1154 * otherwise to the bus that is appropropriate for the scope
1155 * we are running in */
1157 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1159 if (streq(e, "system"))
1160 return sd_bus_open_system(ret);
1161 /// elogind does not support systemd units
1163 else if (STR_IN_SET(e, "session", "user"))
1164 return sd_bus_open_user(ret);
1168 e = secure_getenv("DBUS_STARTER_ADDRESS");
1170 /// elogind does not support systemd units
1172 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1173 return sd_bus_open_user(ret);
1176 return sd_bus_open_system(ret);
1183 r = sd_bus_set_address(b, e);
1187 b->bus_client = true;
1189 /* We don't know whether the bus is trusted or not, so better
1190 * be safe, and authenticate everything */
1192 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1193 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1195 r = sd_bus_start(b);
1207 int bus_set_address_system(sd_bus *b) {
1211 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1213 return sd_bus_set_address(b, e);
1215 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1218 _public_ int sd_bus_open_system(sd_bus **ret) {
1222 assert_return(ret, -EINVAL);
1228 r = bus_set_address_system(b);
1232 b->bus_client = true;
1233 b->is_system = true;
1235 /* Let's do per-method access control on the system bus. We
1236 * need the caller's UID and capability set for that. */
1238 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1239 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1241 r = sd_bus_start(b);
1253 /// elogind can not open/use a user bus
1255 int bus_set_address_user(sd_bus *b) {
1262 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1264 return sd_bus_set_address(b, e);
1266 r = cg_pid_get_owner_uid(0, &uid);
1270 e = secure_getenv("XDG_RUNTIME_DIR");
1272 _cleanup_free_ char *ee = NULL;
1274 ee = bus_address_escape(e);
1278 (void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT ";" UNIX_USER_BUS_ADDRESS_FMT, uid, ee);
1280 (void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT, uid);
1289 _public_ int sd_bus_open_user(sd_bus **ret) {
1290 /// elogind does not support user buses
1295 assert_return(ret, -EINVAL);
1301 r = bus_set_address_user(b);
1305 b->bus_client = true;
1308 /* We don't do any per-method access control on the user
1312 r = sd_bus_start(b);
1323 return sd_bus_open_system(ret);
1327 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1328 _cleanup_free_ char *e = NULL;
1329 char *m = NULL, *c = NULL;
1334 /* Let's see if we shall enter some container */
1335 m = strchr(host, ':');
1339 /* Let's make sure this is not a port of some kind,
1340 * and is a valid machine name. */
1341 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1344 /* Cut out the host part */
1345 t = strndupa(host, m - host - 1);
1346 e = bus_address_escape(t);
1350 c = strjoina(",argv4=--machine=", m);
1355 e = bus_address_escape(host);
1360 b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e, ",argv3=systemd-stdio-bridge", c, NULL);
1367 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1371 assert_return(host, -EINVAL);
1372 assert_return(ret, -EINVAL);
1374 r = sd_bus_new(&bus);
1378 r = bus_set_address_system_remote(bus, host);
1382 bus->bus_client = true;
1383 bus->trusted = false;
1384 bus->is_system = true;
1386 r = sd_bus_start(bus);
1398 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1399 _cleanup_free_ char *e = NULL;
1404 e = bus_address_escape(machine);
1408 b->address = strjoin("x-machine-kernel:machine=", e, ";x-machine-unix:machine=", e, NULL);
1415 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1419 assert_return(machine, -EINVAL);
1420 assert_return(ret, -EINVAL);
1421 assert_return(machine_name_is_valid(machine), -EINVAL);
1423 r = sd_bus_new(&bus);
1427 r = bus_set_address_system_machine(bus, machine);
1431 bus->bus_client = true;
1432 bus->trusted = false;
1433 bus->is_system = true;
1435 r = sd_bus_start(bus);
1447 _public_ void sd_bus_close(sd_bus *bus) {
1451 if (bus->state == BUS_CLOSED)
1453 if (bus_pid_changed(bus))
1456 bus->state = BUS_CLOSED;
1458 sd_bus_detach_event(bus);
1460 /* Drop all queued messages so that they drop references to
1461 * the bus object and the bus may be freed */
1462 bus_reset_queues(bus);
1464 if (!bus->is_kernel)
1467 /* We'll leave the fd open in case this is a kernel bus, since
1468 * there might still be memblocks around that reference this
1469 * bus, and they might need to invoke the KDBUS_CMD_FREE
1470 * ioctl on the fd when they are freed. */
1473 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1481 return sd_bus_unref(bus);
1484 static void bus_enter_closing(sd_bus *bus) {
1487 if (bus->state != BUS_OPENING &&
1488 bus->state != BUS_AUTHENTICATING &&
1489 bus->state != BUS_HELLO &&
1490 bus->state != BUS_RUNNING)
1493 bus->state = BUS_CLOSING;
1496 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1497 assert_return(bus, NULL);
1499 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1504 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1510 i = REFCNT_DEC(bus->n_ref);
1518 /// UNNEEDED by elogind
1520 _public_ int sd_bus_is_open(sd_bus *bus) {
1522 assert_return(bus, -EINVAL);
1523 assert_return(!bus_pid_changed(bus), -ECHILD);
1525 return BUS_IS_OPEN(bus->state);
1529 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1532 assert_return(bus, -EINVAL);
1533 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1534 assert_return(!bus_pid_changed(bus), -ECHILD);
1536 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
1539 if (type == SD_BUS_TYPE_UNIX_FD) {
1540 if (!(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD))
1543 r = bus_ensure_running(bus);
1547 return bus->can_fds;
1550 return bus_type_is_valid(type);
1553 /// UNNEEDED by elogind
1555 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1558 assert_return(bus, -EINVAL);
1559 assert_return(id, -EINVAL);
1560 assert_return(!bus_pid_changed(bus), -ECHILD);
1562 r = bus_ensure_running(bus);
1566 *id = bus->server_id;
1571 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1576 /* If we copy the same message to multiple
1577 * destinations, avoid using the same cookie
1579 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1584 timeout = BUS_DEFAULT_TIMEOUT;
1586 return bus_message_seal(m, ++b->cookie, timeout);
1589 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1590 bool remarshal = false;
1594 /* wrong packet version */
1595 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1598 /* wrong packet endianness */
1599 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1602 /* TODO: kdbus-messages received from the kernel contain data which is
1603 * not allowed to be passed to KDBUS_CMD_SEND. Therefore, we have to
1604 * force remarshaling of the message. Technically, we could just
1605 * recreate the kdbus message, but that is non-trivial as other parts of
1606 * the message refer to m->kdbus already. This should be fixed! */
1607 if ((*m)->kdbus && (*m)->release_kdbus)
1610 return remarshal ? bus_message_remarshal(b, m) : 0;
1613 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1617 /* Fake some timestamps, if they were requested, and not
1618 * already initialized */
1619 if (b->attach_flags & KDBUS_ATTACH_TIMESTAMP) {
1620 if (m->realtime <= 0)
1621 m->realtime = now(CLOCK_REALTIME);
1623 if (m->monotonic <= 0)
1624 m->monotonic = now(CLOCK_MONOTONIC);
1627 /* The bus specification says the serial number cannot be 0,
1628 * hence let's fill something in for synthetic messages. Since
1629 * synthetic messages might have a fake sender and we don't
1630 * want to interfere with the real sender's serial numbers we
1631 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1632 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1633 * even though kdbus can do 64bit. */
1634 return bus_message_seal(m, 0xFFFFFFFFULL, 0);
1637 static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
1644 r = bus_kernel_write_message(bus, m, hint_sync_call);
1646 r = bus_socket_write_message(bus, m, idx);
1651 if (bus->is_kernel || *idx >= BUS_MESSAGE_SIZE(m))
1652 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
1653 bus_message_type_to_string(m->header->type),
1654 strna(sd_bus_message_get_sender(m)),
1655 strna(sd_bus_message_get_destination(m)),
1656 strna(sd_bus_message_get_path(m)),
1657 strna(sd_bus_message_get_interface(m)),
1658 strna(sd_bus_message_get_member(m)),
1659 BUS_MESSAGE_COOKIE(m),
1661 strna(m->error.message));
1666 static int dispatch_wqueue(sd_bus *bus) {
1670 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1672 while (bus->wqueue_size > 0) {
1674 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
1678 /* Didn't do anything this time */
1680 else if (bus->is_kernel || bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1681 /* Fully written. Let's drop the entry from
1684 * This isn't particularly optimized, but
1685 * well, this is supposed to be our worst-case
1686 * buffer only, and the socket buffer is
1687 * supposed to be our primary buffer, and if
1688 * it got full, then all bets are off
1691 bus->wqueue_size --;
1692 sd_bus_message_unref(bus->wqueue[0]);
1693 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1703 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1707 return bus_kernel_read_message(bus, hint_priority, priority);
1709 return bus_socket_read_message(bus);
1712 int bus_rqueue_make_room(sd_bus *bus) {
1715 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1718 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1724 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1729 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1731 /* Note that the priority logic is only available on kdbus,
1732 * where the rqueue is unused. We check the rqueue here
1733 * anyway, because it's simple... */
1736 if (bus->rqueue_size > 0) {
1737 /* Dispatch a queued message */
1739 *m = bus->rqueue[0];
1740 bus->rqueue_size --;
1741 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1745 /* Try to read a new message */
1746 r = bus_read_message(bus, hint_priority, priority);
1756 static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
1757 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1760 assert_return(m, -EINVAL);
1765 assert_return(!bus_pid_changed(bus), -ECHILD);
1766 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1768 if (!BUS_IS_OPEN(bus->state))
1772 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1779 /* If the cookie number isn't kept, then we know that no reply
1781 if (!cookie && !m->sealed)
1782 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1784 r = bus_seal_message(bus, m, 0);
1788 /* Remarshall if we have to. This will possibly unref the
1789 * message and place a replacement in m */
1790 r = bus_remarshal_message(bus, &m);
1794 /* If this is a reply and no reply was requested, then let's
1795 * suppress this, if we can */
1799 if ((bus->state == BUS_RUNNING || bus->state == BUS_HELLO) && bus->wqueue_size <= 0) {
1802 r = bus_write_message(bus, m, hint_sync_call, &idx);
1804 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1805 bus_enter_closing(bus);
1812 if (!bus->is_kernel && idx < BUS_MESSAGE_SIZE(m)) {
1813 /* Wasn't fully written. So let's remember how
1814 * much was written. Note that the first entry
1815 * of the wqueue array is always allocated so
1816 * that we always can remember how much was
1818 bus->wqueue[0] = sd_bus_message_ref(m);
1819 bus->wqueue_size = 1;
1824 /* Just append it to the queue. */
1826 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1829 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1832 bus->wqueue[bus->wqueue_size ++] = sd_bus_message_ref(m);
1837 *cookie = BUS_MESSAGE_COOKIE(m);
1842 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1843 return bus_send_internal(bus, m, cookie, false);
1846 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1849 assert_return(m, -EINVAL);
1854 assert_return(!bus_pid_changed(bus), -ECHILD);
1856 if (!BUS_IS_OPEN(bus->state))
1859 if (!streq_ptr(m->destination, destination)) {
1864 r = sd_bus_message_set_destination(m, destination);
1869 return sd_bus_send(bus, m, cookie);
1872 static usec_t calc_elapse(uint64_t usec) {
1873 if (usec == (uint64_t) -1)
1876 return now(CLOCK_MONOTONIC) + usec;
1879 static int timeout_compare(const void *a, const void *b) {
1880 const struct reply_callback *x = a, *y = b;
1882 if (x->timeout != 0 && y->timeout == 0)
1885 if (x->timeout == 0 && y->timeout != 0)
1888 if (x->timeout < y->timeout)
1891 if (x->timeout > y->timeout)
1897 _public_ int sd_bus_call_async(
1901 sd_bus_message_handler_t callback,
1905 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1906 _cleanup_bus_slot_unref_ sd_bus_slot *s = NULL;
1909 assert_return(m, -EINVAL);
1910 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1911 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1912 assert_return(callback, -EINVAL);
1917 assert_return(!bus_pid_changed(bus), -ECHILD);
1918 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1920 if (!BUS_IS_OPEN(bus->state))
1923 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
1927 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1931 r = bus_seal_message(bus, m, usec);
1935 r = bus_remarshal_message(bus, &m);
1939 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
1943 s->reply_callback.callback = callback;
1945 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
1946 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
1948 s->reply_callback.cookie = 0;
1952 s->reply_callback.timeout = calc_elapse(m->timeout);
1953 if (s->reply_callback.timeout != 0) {
1954 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
1956 s->reply_callback.timeout = 0;
1961 r = sd_bus_send(bus, m, &s->reply_callback.cookie);
1972 int bus_ensure_running(sd_bus *bus) {
1977 if (bus->state == BUS_UNSET || bus->state == BUS_CLOSED || bus->state == BUS_CLOSING)
1979 if (bus->state == BUS_RUNNING)
1983 r = sd_bus_process(bus, NULL);
1986 if (bus->state == BUS_RUNNING)
1991 r = sd_bus_wait(bus, (uint64_t) -1);
1997 _public_ int sd_bus_call(
2001 sd_bus_error *error,
2002 sd_bus_message **reply) {
2004 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
2010 bus_assert_return(m, -EINVAL, error);
2011 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
2012 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
2013 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
2018 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
2019 bus_assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS, error);
2021 if (!BUS_IS_OPEN(bus->state)) {
2026 r = bus_ensure_running(bus);
2030 i = bus->rqueue_size;
2032 r = bus_seal_message(bus, m, usec);
2036 r = bus_remarshal_message(bus, &m);
2040 r = bus_send_internal(bus, m, &cookie, true);
2044 timeout = calc_elapse(m->timeout);
2049 while (i < bus->rqueue_size) {
2050 sd_bus_message *incoming = NULL;
2052 incoming = bus->rqueue[i];
2054 if (incoming->reply_cookie == cookie) {
2055 /* Found a match! */
2057 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2059 log_debug_bus_message(incoming);
2061 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2063 if (incoming->n_fds <= 0 || (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2067 sd_bus_message_unref(incoming);
2072 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2073 sd_bus_message_unref(incoming);
2076 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
2077 r = sd_bus_error_copy(error, &incoming->error);
2078 sd_bus_message_unref(incoming);
2085 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2088 streq(bus->unique_name, incoming->sender)) {
2090 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2093 /* Our own message? Somebody is trying
2094 * to send its own client a message,
2095 * let's not dead-lock, let's fail
2098 sd_bus_message_unref(incoming);
2103 /* Try to read more, right-away */
2107 r = bus_read_message(bus, false, 0);
2109 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2110 bus_enter_closing(bus);
2122 n = now(CLOCK_MONOTONIC);
2130 left = (uint64_t) -1;
2132 r = bus_poll(bus, true, left);
2140 r = dispatch_wqueue(bus);
2142 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2143 bus_enter_closing(bus);
2152 return sd_bus_error_set_errno(error, r);
2155 _public_ int sd_bus_get_fd(sd_bus *bus) {
2157 assert_return(bus, -EINVAL);
2158 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2159 assert_return(!bus_pid_changed(bus), -ECHILD);
2161 return bus->input_fd;
2164 _public_ int sd_bus_get_events(sd_bus *bus) {
2167 assert_return(bus, -EINVAL);
2168 assert_return(!bus_pid_changed(bus), -ECHILD);
2170 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2173 if (bus->state == BUS_OPENING)
2175 else if (bus->state == BUS_AUTHENTICATING) {
2177 if (bus_socket_auth_needs_write(bus))
2182 } else if (bus->state == BUS_RUNNING || bus->state == BUS_HELLO) {
2183 if (bus->rqueue_size <= 0)
2185 if (bus->wqueue_size > 0)
2192 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2193 struct reply_callback *c;
2195 assert_return(bus, -EINVAL);
2196 assert_return(timeout_usec, -EINVAL);
2197 assert_return(!bus_pid_changed(bus), -ECHILD);
2199 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2202 if (bus->track_queue) {
2207 if (bus->state == BUS_CLOSING) {
2212 if (bus->state == BUS_AUTHENTICATING) {
2213 *timeout_usec = bus->auth_timeout;
2217 if (bus->state != BUS_RUNNING && bus->state != BUS_HELLO) {
2218 *timeout_usec = (uint64_t) -1;
2222 if (bus->rqueue_size > 0) {
2227 c = prioq_peek(bus->reply_callbacks_prioq);
2229 *timeout_usec = (uint64_t) -1;
2233 if (c->timeout == 0) {
2234 *timeout_usec = (uint64_t) -1;
2238 *timeout_usec = c->timeout;
2242 static int process_timeout(sd_bus *bus) {
2243 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2244 _cleanup_bus_message_unref_ sd_bus_message* m = NULL;
2245 struct reply_callback *c;
2252 c = prioq_peek(bus->reply_callbacks_prioq);
2256 n = now(CLOCK_MONOTONIC);
2260 r = bus_message_new_synthetic_error(
2263 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2268 r = bus_seal_synthetic_message(bus, m);
2272 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2275 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2278 slot = container_of(c, sd_bus_slot, reply_callback);
2280 bus->iteration_counter ++;
2282 bus->current_message = m;
2283 bus->current_slot = sd_bus_slot_ref(slot);
2284 bus->current_handler = c->callback;
2285 bus->current_userdata = slot->userdata;
2286 r = c->callback(m, slot->userdata, &error_buffer);
2287 bus->current_userdata = NULL;
2288 bus->current_handler = NULL;
2289 bus->current_slot = NULL;
2290 bus->current_message = NULL;
2292 if (slot->floating) {
2293 bus_slot_disconnect(slot);
2294 sd_bus_slot_unref(slot);
2297 sd_bus_slot_unref(slot);
2299 return bus_maybe_reply_error(m, r, &error_buffer);
2302 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2306 if (bus->state != BUS_HELLO)
2309 /* Let's make sure the first message on the bus is the HELLO
2310 * reply. But note that we don't actually parse the message
2311 * here (we leave that to the usual handling), we just verify
2312 * we don't let any earlier msg through. */
2314 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2315 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2318 if (m->reply_cookie != 1)
2324 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2325 _cleanup_bus_message_unref_ sd_bus_message *synthetic_reply = NULL;
2326 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2327 struct reply_callback *c;
2334 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2335 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2338 if (bus->is_kernel && (bus->hello_flags & KDBUS_HELLO_MONITOR))
2341 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2344 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2350 slot = container_of(c, sd_bus_slot, reply_callback);
2352 if (m->n_fds > 0 && !(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2354 /* If the reply contained a file descriptor which we
2355 * didn't want we pass an error instead. */
2357 r = bus_message_new_synthetic_error(
2360 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2365 /* Copy over original timestamp */
2366 synthetic_reply->realtime = m->realtime;
2367 synthetic_reply->monotonic = m->monotonic;
2368 synthetic_reply->seqnum = m->seqnum;
2370 r = bus_seal_synthetic_message(bus, synthetic_reply);
2374 m = synthetic_reply;
2376 r = sd_bus_message_rewind(m, true);
2381 if (c->timeout != 0) {
2382 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2386 bus->current_slot = sd_bus_slot_ref(slot);
2387 bus->current_handler = c->callback;
2388 bus->current_userdata = slot->userdata;
2389 r = c->callback(m, slot->userdata, &error_buffer);
2390 bus->current_userdata = NULL;
2391 bus->current_handler = NULL;
2392 bus->current_slot = NULL;
2394 if (slot->floating) {
2395 bus_slot_disconnect(slot);
2396 sd_bus_slot_unref(slot);
2399 sd_bus_slot_unref(slot);
2401 return bus_maybe_reply_error(m, r, &error_buffer);
2404 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2405 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2406 struct filter_callback *l;
2413 bus->filter_callbacks_modified = false;
2415 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2418 if (bus->filter_callbacks_modified)
2421 /* Don't run this more than once per iteration */
2422 if (l->last_iteration == bus->iteration_counter)
2425 l->last_iteration = bus->iteration_counter;
2427 r = sd_bus_message_rewind(m, true);
2431 slot = container_of(l, sd_bus_slot, filter_callback);
2433 bus->current_slot = sd_bus_slot_ref(slot);
2434 bus->current_handler = l->callback;
2435 bus->current_userdata = slot->userdata;
2436 r = l->callback(m, slot->userdata, &error_buffer);
2437 bus->current_userdata = NULL;
2438 bus->current_handler = NULL;
2439 bus->current_slot = sd_bus_slot_unref(slot);
2441 r = bus_maybe_reply_error(m, r, &error_buffer);
2447 } while (bus->filter_callbacks_modified);
2452 static int process_match(sd_bus *bus, sd_bus_message *m) {
2459 bus->match_callbacks_modified = false;
2461 r = bus_match_run(bus, &bus->match_callbacks, m);
2465 } while (bus->match_callbacks_modified);
2470 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2471 _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
2477 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2480 if (bus->manual_peer_interface)
2483 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2486 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2489 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2492 if (streq_ptr(m->member, "Ping"))
2493 r = sd_bus_message_new_method_return(m, &reply);
2494 else if (streq_ptr(m->member, "GetMachineId")) {
2498 r = sd_id128_get_machine(&id);
2502 r = sd_bus_message_new_method_return(m, &reply);
2506 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2508 r = sd_bus_message_new_method_errorf(
2510 SD_BUS_ERROR_UNKNOWN_METHOD,
2511 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2517 r = sd_bus_send(bus, reply, NULL);
2524 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2528 /* If we got a message with a file descriptor which we didn't
2529 * want to accept, then let's drop it. How can this even
2530 * happen? For example, when the kernel queues a message into
2531 * an activatable names's queue which allows fds, and then is
2532 * delivered to us later even though we ourselves did not
2535 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2541 if (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)
2544 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2545 return 1; /* just eat it up */
2547 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2550 static int process_message(sd_bus *bus, sd_bus_message *m) {
2556 bus->current_message = m;
2557 bus->iteration_counter++;
2559 log_debug_bus_message(m);
2561 r = process_hello(bus, m);
2565 r = process_reply(bus, m);
2569 r = process_fd_check(bus, m);
2573 r = process_filter(bus, m);
2577 r = process_match(bus, m);
2581 r = process_builtin(bus, m);
2585 r = bus_process_object(bus, m);
2588 bus->current_message = NULL;
2592 static int dispatch_track(sd_bus *bus) {
2595 if (!bus->track_queue)
2598 bus_track_dispatch(bus->track_queue);
2602 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2603 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2607 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
2609 r = process_timeout(bus);
2613 r = dispatch_wqueue(bus);
2617 r = dispatch_track(bus);
2621 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2627 r = process_message(bus, m);
2632 r = sd_bus_message_rewind(m, true);
2641 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2643 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2644 strna(sd_bus_message_get_sender(m)),
2645 strna(sd_bus_message_get_path(m)),
2646 strna(sd_bus_message_get_interface(m)),
2647 strna(sd_bus_message_get_member(m)));
2649 r = sd_bus_reply_method_errorf(
2651 SD_BUS_ERROR_UNKNOWN_OBJECT,
2652 "Unknown object '%s'.", m->path);
2666 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2667 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2668 struct reply_callback *c;
2672 assert(bus->state == BUS_CLOSING);
2674 c = ordered_hashmap_first(bus->reply_callbacks);
2676 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2679 /* First, fail all outstanding method calls */
2680 r = bus_message_new_synthetic_error(
2683 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2688 r = bus_seal_synthetic_message(bus, m);
2692 if (c->timeout != 0) {
2693 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2697 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2700 slot = container_of(c, sd_bus_slot, reply_callback);
2702 bus->iteration_counter++;
2704 bus->current_message = m;
2705 bus->current_slot = sd_bus_slot_ref(slot);
2706 bus->current_handler = c->callback;
2707 bus->current_userdata = slot->userdata;
2708 r = c->callback(m, slot->userdata, &error_buffer);
2709 bus->current_userdata = NULL;
2710 bus->current_handler = NULL;
2711 bus->current_slot = NULL;
2712 bus->current_message = NULL;
2714 if (slot->floating) {
2715 bus_slot_disconnect(slot);
2716 sd_bus_slot_unref(slot);
2719 sd_bus_slot_unref(slot);
2721 return bus_maybe_reply_error(m, r, &error_buffer);
2724 /* Then, synthesize a Disconnected message */
2725 r = sd_bus_message_new_signal(
2728 "/org/freedesktop/DBus/Local",
2729 "org.freedesktop.DBus.Local",
2734 bus_message_set_sender_local(bus, m);
2736 r = bus_seal_synthetic_message(bus, m);
2742 bus->current_message = m;
2743 bus->iteration_counter++;
2745 r = process_filter(bus, m);
2749 r = process_match(bus, m);
2761 bus->current_message = NULL;
2766 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2767 BUS_DONT_DESTROY(bus);
2770 /* Returns 0 when we didn't do anything. This should cause the
2771 * caller to invoke sd_bus_wait() before returning the next
2772 * time. Returns > 0 when we did something, which possibly
2773 * means *ret is filled in with an unprocessed message. */
2775 assert_return(bus, -EINVAL);
2776 assert_return(!bus_pid_changed(bus), -ECHILD);
2778 /* We don't allow recursively invoking sd_bus_process(). */
2779 assert_return(!bus->current_message, -EBUSY);
2780 assert(!bus->current_slot);
2782 switch (bus->state) {
2791 r = bus_socket_process_opening(bus);
2792 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2793 bus_enter_closing(bus);
2801 case BUS_AUTHENTICATING:
2802 r = bus_socket_process_authenticating(bus);
2803 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2804 bus_enter_closing(bus);
2816 r = process_running(bus, hint_priority, priority, ret);
2817 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2818 bus_enter_closing(bus);
2828 return process_closing(bus, ret);
2831 assert_not_reached("Unknown state");
2834 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2835 return bus_process_internal(bus, false, 0, ret);
2838 /// UNNEEDED by elogind
2840 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2841 return bus_process_internal(bus, true, priority, ret);
2845 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2846 struct pollfd p[2] = {};
2849 usec_t m = USEC_INFINITY;
2853 if (bus->state == BUS_CLOSING)
2856 if (!BUS_IS_OPEN(bus->state))
2859 e = sd_bus_get_events(bus);
2864 /* The caller really needs some more data, he doesn't
2865 * care about what's already read, or any timeouts
2866 * except its own. */
2870 /* The caller wants to process if there's something to
2871 * process, but doesn't care otherwise */
2873 r = sd_bus_get_timeout(bus, &until);
2878 nw = now(CLOCK_MONOTONIC);
2879 m = until > nw ? until - nw : 0;
2883 if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
2886 p[0].fd = bus->input_fd;
2887 if (bus->output_fd == bus->input_fd) {
2891 p[0].events = e & POLLIN;
2892 p[1].fd = bus->output_fd;
2893 p[1].events = e & POLLOUT;
2897 r = ppoll(p, n, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
2901 return r > 0 ? 1 : 0;
2904 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2906 assert_return(bus, -EINVAL);
2907 assert_return(!bus_pid_changed(bus), -ECHILD);
2909 if (bus->state == BUS_CLOSING)
2912 if (!BUS_IS_OPEN(bus->state))
2915 if (bus->rqueue_size > 0)
2918 return bus_poll(bus, false, timeout_usec);
2921 _public_ int sd_bus_flush(sd_bus *bus) {
2924 assert_return(bus, -EINVAL);
2925 assert_return(!bus_pid_changed(bus), -ECHILD);
2927 if (bus->state == BUS_CLOSING)
2930 if (!BUS_IS_OPEN(bus->state))
2933 r = bus_ensure_running(bus);
2937 if (bus->wqueue_size <= 0)
2941 r = dispatch_wqueue(bus);
2943 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2944 bus_enter_closing(bus);
2951 if (bus->wqueue_size <= 0)
2954 r = bus_poll(bus, false, (uint64_t) -1);
2960 _public_ int sd_bus_add_filter(
2963 sd_bus_message_handler_t callback,
2968 assert_return(bus, -EINVAL);
2969 assert_return(callback, -EINVAL);
2970 assert_return(!bus_pid_changed(bus), -ECHILD);
2972 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
2976 s->filter_callback.callback = callback;
2978 bus->filter_callbacks_modified = true;
2979 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
2987 _public_ int sd_bus_add_match(
2991 sd_bus_message_handler_t callback,
2994 struct bus_match_component *components = NULL;
2995 unsigned n_components = 0;
2996 sd_bus_slot *s = NULL;
2999 assert_return(bus, -EINVAL);
3000 assert_return(match, -EINVAL);
3001 assert_return(!bus_pid_changed(bus), -ECHILD);
3003 r = bus_match_parse(match, &components, &n_components);
3007 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
3013 s->match_callback.callback = callback;
3014 s->match_callback.cookie = ++bus->match_cookie;
3016 if (bus->bus_client) {
3017 enum bus_match_scope scope;
3019 scope = bus_match_get_scope(components, n_components);
3021 /* Do not install server-side matches for matches
3022 * against the local service, interface or bus
3024 if (scope != BUS_MATCH_LOCAL) {
3026 if (!bus->is_kernel) {
3027 /* When this is not a kernel transport, we
3028 * store the original match string, so that we
3029 * can use it to remove the match again */
3031 s->match_callback.match_string = strdup(match);
3032 if (!s->match_callback.match_string) {
3038 r = bus_add_match_internal(bus, s->match_callback.match_string, components, n_components, s->match_callback.cookie);
3042 s->match_added = true;
3046 bus->match_callbacks_modified = true;
3047 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3056 bus_match_parse_free(components, n_components);
3057 sd_bus_slot_unref(s);
3062 /// UNNEEDED by elogind
3064 int bus_remove_match_by_string(
3067 sd_bus_message_handler_t callback,
3070 struct bus_match_component *components = NULL;
3071 unsigned n_components = 0;
3072 struct match_callback *c;
3075 assert_return(bus, -EINVAL);
3076 assert_return(match, -EINVAL);
3077 assert_return(!bus_pid_changed(bus), -ECHILD);
3079 r = bus_match_parse(match, &components, &n_components);
3083 r = bus_match_find(&bus->match_callbacks, components, n_components, NULL, NULL, &c);
3087 sd_bus_slot_unref(container_of(c, sd_bus_slot, match_callback));
3090 bus_match_parse_free(components, n_components);
3096 bool bus_pid_changed(sd_bus *bus) {
3099 /* We don't support people creating a bus connection and
3100 * keeping it around over a fork(). Let's complain. */
3102 return bus->original_pid != getpid();
3105 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3106 sd_bus *bus = userdata;
3111 r = sd_bus_process(bus, NULL);
3118 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3119 sd_bus *bus = userdata;
3124 r = sd_bus_process(bus, NULL);
3131 static int prepare_callback(sd_event_source *s, void *userdata) {
3132 sd_bus *bus = userdata;
3139 e = sd_bus_get_events(bus);
3143 if (bus->output_fd != bus->input_fd) {
3145 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3149 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3153 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3158 r = sd_bus_get_timeout(bus, &until);
3164 j = sd_event_source_set_time(bus->time_event_source, until);
3169 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3176 static int quit_callback(sd_event_source *event, void *userdata) {
3177 sd_bus *bus = userdata;
3187 static int attach_io_events(sd_bus *bus) {
3192 if (bus->input_fd < 0)
3198 if (!bus->input_io_event_source) {
3199 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3203 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3207 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3211 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3213 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3218 if (bus->output_fd != bus->input_fd) {
3219 assert(bus->output_fd >= 0);
3221 if (!bus->output_io_event_source) {
3222 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3226 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3230 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3232 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3241 static void detach_io_events(sd_bus *bus) {
3244 if (bus->input_io_event_source) {
3245 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3246 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3249 if (bus->output_io_event_source) {
3250 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3251 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3255 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3258 assert_return(bus, -EINVAL);
3259 assert_return(!bus->event, -EBUSY);
3261 assert(!bus->input_io_event_source);
3262 assert(!bus->output_io_event_source);
3263 assert(!bus->time_event_source);
3266 bus->event = sd_event_ref(event);
3268 r = sd_event_default(&bus->event);
3273 bus->event_priority = priority;
3275 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3279 r = sd_event_source_set_priority(bus->time_event_source, priority);
3283 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3287 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3291 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3295 r = attach_io_events(bus);
3302 sd_bus_detach_event(bus);
3306 _public_ int sd_bus_detach_event(sd_bus *bus) {
3307 assert_return(bus, -EINVAL);
3312 detach_io_events(bus);
3314 if (bus->time_event_source) {
3315 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3316 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3319 if (bus->quit_event_source) {
3320 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3321 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3324 bus->event = sd_event_unref(bus->event);
3328 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3329 assert_return(bus, NULL);
3334 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3335 assert_return(bus, NULL);
3337 return bus->current_message;
3340 /// UNNEEDED by elogind
3342 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3343 assert_return(bus, NULL);
3345 return bus->current_slot;
3349 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3350 assert_return(bus, NULL);
3352 return bus->current_handler;
3355 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3356 assert_return(bus, NULL);
3358 return bus->current_userdata;
3361 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3366 assert(default_bus);
3369 return !!*default_bus;
3372 *ret = sd_bus_ref(*default_bus);
3380 b->default_bus_ptr = default_bus;
3388 _public_ int sd_bus_default_system(sd_bus **ret) {
3389 static thread_local sd_bus *default_system_bus = NULL;
3391 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3394 _public_ int sd_bus_default_user(sd_bus **ret) {
3395 /// elogind does not support user buses
3397 static thread_local sd_bus *default_user_bus = NULL;
3399 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3401 return sd_bus_default_system(ret);
3405 _public_ int sd_bus_default(sd_bus **ret) {
3409 /* Let's try our best to reuse another cached connection. If
3410 * the starter bus type is set, connect via our normal
3411 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3412 * we can share the connection with the user/system default
3415 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3417 if (streq(e, "system"))
3418 return sd_bus_default_system(ret);
3419 /// elogind does not support systemd units
3421 else if (STR_IN_SET(e, "user", "session"))
3422 return sd_bus_default_user(ret);
3426 /* No type is specified, so we have not other option than to
3427 * use the starter address if it is set. */
3429 e = secure_getenv("DBUS_STARTER_ADDRESS");
3431 static thread_local sd_bus *default_starter_bus = NULL;
3433 return bus_default(sd_bus_open, &default_starter_bus, ret);
3436 /* Finally, if nothing is set use the cached connection for
3437 * the right scope */
3438 /// elogind does not support systemd units
3440 if (cg_pid_get_owner_uid(0, NULL) >= 0)
3441 return sd_bus_default_user(ret);
3444 return sd_bus_default_system(ret);
3447 /// UNNEEDED by elogind
3449 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3450 assert_return(b, -EINVAL);
3451 assert_return(tid, -EINVAL);
3452 assert_return(!bus_pid_changed(b), -ECHILD);
3460 return sd_event_get_tid(b->event, tid);
3465 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3466 _cleanup_free_ char *e = NULL;
3469 assert_return(object_path_is_valid(prefix), -EINVAL);
3470 assert_return(external_id, -EINVAL);
3471 assert_return(ret_path, -EINVAL);
3473 e = bus_label_escape(external_id);
3477 ret = strjoin(prefix, "/", e, NULL);
3485 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3489 assert_return(object_path_is_valid(path), -EINVAL);
3490 assert_return(object_path_is_valid(prefix), -EINVAL);
3491 assert_return(external_id, -EINVAL);
3493 e = object_path_startswith(path, prefix);
3495 *external_id = NULL;
3499 ret = bus_label_unescape(e);
3508 _public_ int sd_bus_try_close(sd_bus *bus) {
3511 assert_return(bus, -EINVAL);
3512 assert_return(!bus_pid_changed(bus), -ECHILD);
3514 if (!bus->is_kernel)
3517 if (!BUS_IS_OPEN(bus->state))
3520 if (bus->rqueue_size > 0)
3523 if (bus->wqueue_size > 0)
3526 r = bus_kernel_try_close(bus);
3534 /// UNNEEDED by elogind
3536 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3537 assert_return(bus, -EINVAL);
3538 assert_return(description, -EINVAL);
3539 assert_return(bus->description, -ENXIO);
3540 assert_return(!bus_pid_changed(bus), -ECHILD);
3542 *description = bus->description;
3547 int bus_get_root_path(sd_bus *bus) {
3550 if (bus->cgroup_root)
3553 r = cg_get_root_path(&bus->cgroup_root);
3555 bus->cgroup_root = strdup("/");
3556 if (!bus->cgroup_root)
3565 /// UNNEEDED by elogind
3567 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3570 assert_return(bus, -EINVAL);
3571 assert_return(scope, -EINVAL);
3572 assert_return(!bus_pid_changed(bus), -ECHILD);
3574 if (bus->is_kernel) {
3575 _cleanup_free_ char *n = NULL;
3578 r = bus_kernel_get_bus_name(bus, &n);
3582 if (streq(n, "0-system")) {
3587 dash = strchr(n, '-');
3588 if (streq_ptr(dash, "-user")) {
3599 if (bus->is_system) {
3607 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3609 assert_return(bus, -EINVAL);
3610 assert_return(address, -EINVAL);
3611 assert_return(!bus_pid_changed(bus), -ECHILD);
3614 *address = bus->address;
3621 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
3622 assert_return(bus, -EINVAL);
3623 assert_return(mask, -EINVAL);
3624 assert_return(!bus_pid_changed(bus), -ECHILD);
3626 *mask = bus->creds_mask;
3630 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
3631 assert_return(bus, -EINVAL);
3632 assert_return(!bus_pid_changed(bus), -ECHILD);
3634 return bus->bus_client;
3637 _public_ int sd_bus_is_server(sd_bus *bus) {
3638 assert_return(bus, -EINVAL);
3639 assert_return(!bus_pid_changed(bus), -ECHILD);
3641 return bus->is_server;
3644 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
3645 assert_return(bus, -EINVAL);
3646 assert_return(!bus_pid_changed(bus), -ECHILD);
3648 return bus->anonymous_auth;
3651 _public_ int sd_bus_is_trusted(sd_bus *bus) {
3652 assert_return(bus, -EINVAL);
3653 assert_return(!bus_pid_changed(bus), -ECHILD);
3655 return bus->trusted;
3658 _public_ int sd_bus_is_monitor(sd_bus *bus) {
3659 assert_return(bus, -EINVAL);
3660 assert_return(!bus_pid_changed(bus), -ECHILD);
3662 return !!(bus->hello_flags & KDBUS_HELLO_MONITOR);