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;
837 r = parse_pid(pid, &b->nspid);
843 b->sockaddr.un.sun_family = AF_UNIX;
844 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
845 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + strlen("/var/run/dbus/system_bus_socket");
850 static int parse_container_kernel_address(sd_bus *b, const char **p, char **guid) {
851 _cleanup_free_ char *machine = NULL, *pid = NULL;
859 while (**p != 0 && **p != ';') {
860 r = parse_address_key(p, "guid", guid);
866 r = parse_address_key(p, "machine", &machine);
872 r = parse_address_key(p, "pid", &pid);
881 if (!machine == !pid)
885 if (!machine_name_is_valid(machine))
889 b->machine = machine;
897 r = parse_pid(pid, &b->nspid);
903 r = free_and_strdup(&b->kernel, "/sys/fs/kdbus/0-system/bus");
910 static void bus_reset_parsed_address(sd_bus *b) {
914 b->sockaddr_size = 0;
915 b->exec_argv = strv_free(b->exec_argv);
916 b->exec_path = mfree(b->exec_path);
917 b->server_id = SD_ID128_NULL;
918 b->kernel = mfree(b->kernel);
919 b->machine = mfree(b->machine);
923 static int bus_parse_next_address(sd_bus *b) {
924 _cleanup_free_ char *guid = NULL;
932 if (b->address[b->address_index] == 0)
935 bus_reset_parsed_address(b);
937 a = b->address + b->address_index;
946 if (startswith(a, "unix:")) {
949 r = parse_unix_address(b, &a, &guid);
954 } else if (startswith(a, "tcp:")) {
957 r = parse_tcp_address(b, &a, &guid);
963 } else if (startswith(a, "unixexec:")) {
966 r = parse_exec_address(b, &a, &guid);
972 } else if (startswith(a, "kernel:")) {
975 r = parse_kernel_address(b, &a, &guid);
980 } else if (startswith(a, "x-machine-unix:")) {
983 r = parse_container_unix_address(b, &a, &guid);
988 } else if (startswith(a, "x-machine-kernel:")) {
991 r = parse_container_kernel_address(b, &a, &guid);
1004 r = sd_id128_from_string(guid, &b->server_id);
1009 b->address_index = a - b->address;
1013 static int bus_start_address(sd_bus *b) {
1014 bool container_kdbus_available = false;
1015 bool kdbus_available = false;
1021 bool skipped = false;
1026 * Usually, if you provide multiple different bus-addresses, we
1027 * try all of them in order. We use the first one that
1028 * succeeds. However, if you mix kernel and unix addresses, we
1029 * never try unix-addresses if a previous kernel address was
1030 * tried and kdbus was available. This is required to prevent
1031 * clients to fallback to the bus-proxy if kdbus is available
1032 * but failed (eg., too many connections).
1036 r = bus_socket_exec(b);
1037 else if ((b->nspid > 0 || b->machine) && b->kernel) {
1038 r = bus_container_connect_kernel(b);
1039 if (r < 0 && !IN_SET(r, -ENOENT, -ESOCKTNOSUPPORT))
1040 container_kdbus_available = true;
1041 } else if (!container_kdbus_available && (b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC)
1042 r = bus_container_connect_socket(b);
1043 else if (b->kernel) {
1044 r = bus_kernel_connect(b);
1045 if (r < 0 && !IN_SET(r, -ENOENT, -ESOCKTNOSUPPORT))
1046 kdbus_available = true;
1047 } else if (!kdbus_available && b->sockaddr.sa.sa_family != AF_UNSPEC)
1048 r = bus_socket_connect(b);
1054 r = attach_io_events(b);
1059 b->last_connect_error = -r;
1062 r = bus_parse_next_address(b);
1066 return b->last_connect_error ? -b->last_connect_error : -ECONNREFUSED;
1070 int bus_next_address(sd_bus *b) {
1073 bus_reset_parsed_address(b);
1074 return bus_start_address(b);
1077 static int bus_start_fd(sd_bus *b) {
1082 assert(b->input_fd >= 0);
1083 assert(b->output_fd >= 0);
1085 r = fd_nonblock(b->input_fd, true);
1089 r = fd_cloexec(b->input_fd, true);
1093 if (b->input_fd != b->output_fd) {
1094 r = fd_nonblock(b->output_fd, true);
1098 r = fd_cloexec(b->output_fd, true);
1103 if (fstat(b->input_fd, &st) < 0)
1106 if (S_ISCHR(b->input_fd))
1107 return bus_kernel_take_fd(b);
1109 return bus_socket_take_fd(b);
1112 _public_ int sd_bus_start(sd_bus *bus) {
1115 assert_return(bus, -EINVAL);
1116 assert_return(bus->state == BUS_UNSET, -EPERM);
1117 assert_return(!bus_pid_changed(bus), -ECHILD);
1119 bus->state = BUS_OPENING;
1121 if (bus->is_server && bus->bus_client)
1124 if (bus->input_fd >= 0)
1125 r = bus_start_fd(bus);
1126 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->kernel || bus->machine)
1127 r = bus_start_address(bus);
1136 return bus_send_hello(bus);
1139 _public_ int sd_bus_open(sd_bus **ret) {
1144 assert_return(ret, -EINVAL);
1146 /* Let's connect to the starter bus if it is set, and
1147 * otherwise to the bus that is appropropriate for the scope
1148 * we are running in */
1150 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1152 if (streq(e, "system"))
1153 return sd_bus_open_system(ret);
1154 else if (STR_IN_SET(e, "session", "user"))
1155 return sd_bus_open_user(ret);
1158 e = secure_getenv("DBUS_STARTER_ADDRESS");
1160 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1161 return sd_bus_open_user(ret);
1163 return sd_bus_open_system(ret);
1170 r = sd_bus_set_address(b, e);
1174 b->bus_client = true;
1176 /* We don't know whether the bus is trusted or not, so better
1177 * be safe, and authenticate everything */
1179 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1180 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1182 r = sd_bus_start(b);
1194 int bus_set_address_system(sd_bus *b) {
1198 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1200 return sd_bus_set_address(b, e);
1202 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1205 _public_ int sd_bus_open_system(sd_bus **ret) {
1209 assert_return(ret, -EINVAL);
1215 r = bus_set_address_system(b);
1219 b->bus_client = true;
1220 b->is_system = true;
1222 /* Let's do per-method access control on the system bus. We
1223 * need the caller's UID and capability set for that. */
1225 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1226 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1228 r = sd_bus_start(b);
1240 int bus_set_address_user(sd_bus *b) {
1245 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1247 return sd_bus_set_address(b, e);
1249 e = secure_getenv("XDG_RUNTIME_DIR");
1251 _cleanup_free_ char *ee = NULL;
1253 ee = bus_address_escape(e);
1257 (void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT ";" UNIX_USER_BUS_ADDRESS_FMT, getuid(), ee);
1259 (void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT, getuid());
1267 _public_ int sd_bus_open_user(sd_bus **ret) {
1271 assert_return(ret, -EINVAL);
1277 r = bus_set_address_user(b);
1281 b->bus_client = true;
1284 /* We don't do any per-method access control on the user
1288 r = sd_bus_start(b);
1300 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1301 _cleanup_free_ char *e = NULL;
1302 char *m = NULL, *c = NULL;
1307 /* Let's see if we shall enter some container */
1308 m = strchr(host, ':');
1312 /* Let's make sure this is not a port of some kind,
1313 * and is a valid machine name. */
1314 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1317 /* Cut out the host part */
1318 t = strndupa(host, m - host - 1);
1319 e = bus_address_escape(t);
1323 c = strjoina(",argv4=--machine=", m);
1328 e = bus_address_escape(host);
1333 b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e, ",argv3=systemd-stdio-bridge", c, NULL);
1340 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1344 assert_return(host, -EINVAL);
1345 assert_return(ret, -EINVAL);
1347 r = sd_bus_new(&bus);
1351 r = bus_set_address_system_remote(bus, host);
1355 bus->bus_client = true;
1356 bus->trusted = false;
1357 bus->is_system = true;
1359 r = sd_bus_start(bus);
1371 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1372 _cleanup_free_ char *e = NULL;
1377 e = bus_address_escape(machine);
1381 b->address = strjoin("x-machine-kernel:machine=", e, ";x-machine-unix:machine=", e, NULL);
1388 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1392 assert_return(machine, -EINVAL);
1393 assert_return(ret, -EINVAL);
1394 assert_return(machine_name_is_valid(machine), -EINVAL);
1396 r = sd_bus_new(&bus);
1400 r = bus_set_address_system_machine(bus, machine);
1404 bus->bus_client = true;
1405 bus->trusted = false;
1406 bus->is_system = true;
1408 r = sd_bus_start(bus);
1420 _public_ void sd_bus_close(sd_bus *bus) {
1424 if (bus->state == BUS_CLOSED)
1426 if (bus_pid_changed(bus))
1429 bus->state = BUS_CLOSED;
1431 sd_bus_detach_event(bus);
1433 /* Drop all queued messages so that they drop references to
1434 * the bus object and the bus may be freed */
1435 bus_reset_queues(bus);
1437 if (!bus->is_kernel)
1440 /* We'll leave the fd open in case this is a kernel bus, since
1441 * there might still be memblocks around that reference this
1442 * bus, and they might need to invoke the KDBUS_CMD_FREE
1443 * ioctl on the fd when they are freed. */
1446 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1454 return sd_bus_unref(bus);
1457 static void bus_enter_closing(sd_bus *bus) {
1460 if (bus->state != BUS_OPENING &&
1461 bus->state != BUS_AUTHENTICATING &&
1462 bus->state != BUS_HELLO &&
1463 bus->state != BUS_RUNNING)
1466 bus->state = BUS_CLOSING;
1469 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1470 assert_return(bus, NULL);
1472 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1477 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1483 i = REFCNT_DEC(bus->n_ref);
1491 /// UNNEEDED by elogind
1493 _public_ int sd_bus_is_open(sd_bus *bus) {
1495 assert_return(bus, -EINVAL);
1496 assert_return(!bus_pid_changed(bus), -ECHILD);
1498 return BUS_IS_OPEN(bus->state);
1502 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1505 assert_return(bus, -EINVAL);
1506 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1507 assert_return(!bus_pid_changed(bus), -ECHILD);
1509 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
1512 if (type == SD_BUS_TYPE_UNIX_FD) {
1513 if (!(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD))
1516 r = bus_ensure_running(bus);
1520 return bus->can_fds;
1523 return bus_type_is_valid(type);
1526 /// UNNEEDED by elogind
1528 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1531 assert_return(bus, -EINVAL);
1532 assert_return(id, -EINVAL);
1533 assert_return(!bus_pid_changed(bus), -ECHILD);
1535 r = bus_ensure_running(bus);
1539 *id = bus->server_id;
1544 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1549 /* If we copy the same message to multiple
1550 * destinations, avoid using the same cookie
1552 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1557 timeout = BUS_DEFAULT_TIMEOUT;
1559 return bus_message_seal(m, ++b->cookie, timeout);
1562 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1563 bool remarshal = false;
1567 /* wrong packet version */
1568 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1571 /* wrong packet endianness */
1572 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1575 /* TODO: kdbus-messages received from the kernel contain data which is
1576 * not allowed to be passed to KDBUS_CMD_SEND. Therefore, we have to
1577 * force remarshaling of the message. Technically, we could just
1578 * recreate the kdbus message, but that is non-trivial as other parts of
1579 * the message refer to m->kdbus already. This should be fixed! */
1580 if ((*m)->kdbus && (*m)->release_kdbus)
1583 return remarshal ? bus_message_remarshal(b, m) : 0;
1586 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1590 /* Fake some timestamps, if they were requested, and not
1591 * already initialized */
1592 if (b->attach_flags & KDBUS_ATTACH_TIMESTAMP) {
1593 if (m->realtime <= 0)
1594 m->realtime = now(CLOCK_REALTIME);
1596 if (m->monotonic <= 0)
1597 m->monotonic = now(CLOCK_MONOTONIC);
1600 /* The bus specification says the serial number cannot be 0,
1601 * hence let's fill something in for synthetic messages. Since
1602 * synthetic messages might have a fake sender and we don't
1603 * want to interfere with the real sender's serial numbers we
1604 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1605 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1606 * even though kdbus can do 64bit. */
1607 return bus_message_seal(m, 0xFFFFFFFFULL, 0);
1610 static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
1617 r = bus_kernel_write_message(bus, m, hint_sync_call);
1619 r = bus_socket_write_message(bus, m, idx);
1624 if (bus->is_kernel || *idx >= BUS_MESSAGE_SIZE(m))
1625 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
1626 bus_message_type_to_string(m->header->type),
1627 strna(sd_bus_message_get_sender(m)),
1628 strna(sd_bus_message_get_destination(m)),
1629 strna(sd_bus_message_get_path(m)),
1630 strna(sd_bus_message_get_interface(m)),
1631 strna(sd_bus_message_get_member(m)),
1632 BUS_MESSAGE_COOKIE(m),
1634 strna(m->error.message));
1639 static int dispatch_wqueue(sd_bus *bus) {
1643 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1645 while (bus->wqueue_size > 0) {
1647 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
1651 /* Didn't do anything this time */
1653 else if (bus->is_kernel || bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1654 /* Fully written. Let's drop the entry from
1657 * This isn't particularly optimized, but
1658 * well, this is supposed to be our worst-case
1659 * buffer only, and the socket buffer is
1660 * supposed to be our primary buffer, and if
1661 * it got full, then all bets are off
1664 bus->wqueue_size --;
1665 sd_bus_message_unref(bus->wqueue[0]);
1666 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1676 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1680 return bus_kernel_read_message(bus, hint_priority, priority);
1682 return bus_socket_read_message(bus);
1685 int bus_rqueue_make_room(sd_bus *bus) {
1688 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1691 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1697 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1702 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1704 /* Note that the priority logic is only available on kdbus,
1705 * where the rqueue is unused. We check the rqueue here
1706 * anyway, because it's simple... */
1709 if (bus->rqueue_size > 0) {
1710 /* Dispatch a queued message */
1712 *m = bus->rqueue[0];
1713 bus->rqueue_size --;
1714 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1718 /* Try to read a new message */
1719 r = bus_read_message(bus, hint_priority, priority);
1729 static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
1730 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1733 assert_return(m, -EINVAL);
1738 assert_return(!bus_pid_changed(bus), -ECHILD);
1739 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1741 if (!BUS_IS_OPEN(bus->state))
1745 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1752 /* If the cookie number isn't kept, then we know that no reply
1754 if (!cookie && !m->sealed)
1755 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1757 r = bus_seal_message(bus, m, 0);
1761 /* Remarshall if we have to. This will possibly unref the
1762 * message and place a replacement in m */
1763 r = bus_remarshal_message(bus, &m);
1767 /* If this is a reply and no reply was requested, then let's
1768 * suppress this, if we can */
1772 if ((bus->state == BUS_RUNNING || bus->state == BUS_HELLO) && bus->wqueue_size <= 0) {
1775 r = bus_write_message(bus, m, hint_sync_call, &idx);
1777 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1778 bus_enter_closing(bus);
1785 if (!bus->is_kernel && idx < BUS_MESSAGE_SIZE(m)) {
1786 /* Wasn't fully written. So let's remember how
1787 * much was written. Note that the first entry
1788 * of the wqueue array is always allocated so
1789 * that we always can remember how much was
1791 bus->wqueue[0] = sd_bus_message_ref(m);
1792 bus->wqueue_size = 1;
1797 /* Just append it to the queue. */
1799 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1802 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1805 bus->wqueue[bus->wqueue_size ++] = sd_bus_message_ref(m);
1810 *cookie = BUS_MESSAGE_COOKIE(m);
1815 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1816 return bus_send_internal(bus, m, cookie, false);
1819 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1822 assert_return(m, -EINVAL);
1827 assert_return(!bus_pid_changed(bus), -ECHILD);
1829 if (!BUS_IS_OPEN(bus->state))
1832 if (!streq_ptr(m->destination, destination)) {
1837 r = sd_bus_message_set_destination(m, destination);
1842 return sd_bus_send(bus, m, cookie);
1845 static usec_t calc_elapse(uint64_t usec) {
1846 if (usec == (uint64_t) -1)
1849 return now(CLOCK_MONOTONIC) + usec;
1852 static int timeout_compare(const void *a, const void *b) {
1853 const struct reply_callback *x = a, *y = b;
1855 if (x->timeout != 0 && y->timeout == 0)
1858 if (x->timeout == 0 && y->timeout != 0)
1861 if (x->timeout < y->timeout)
1864 if (x->timeout > y->timeout)
1870 _public_ int sd_bus_call_async(
1874 sd_bus_message_handler_t callback,
1878 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1879 _cleanup_bus_slot_unref_ sd_bus_slot *s = NULL;
1882 assert_return(m, -EINVAL);
1883 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1884 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1885 assert_return(callback, -EINVAL);
1890 assert_return(!bus_pid_changed(bus), -ECHILD);
1891 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1893 if (!BUS_IS_OPEN(bus->state))
1896 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
1900 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1904 r = bus_seal_message(bus, m, usec);
1908 r = bus_remarshal_message(bus, &m);
1912 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
1916 s->reply_callback.callback = callback;
1918 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
1919 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
1921 s->reply_callback.cookie = 0;
1925 s->reply_callback.timeout = calc_elapse(m->timeout);
1926 if (s->reply_callback.timeout != 0) {
1927 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
1929 s->reply_callback.timeout = 0;
1934 r = sd_bus_send(bus, m, &s->reply_callback.cookie);
1945 int bus_ensure_running(sd_bus *bus) {
1950 if (bus->state == BUS_UNSET || bus->state == BUS_CLOSED || bus->state == BUS_CLOSING)
1952 if (bus->state == BUS_RUNNING)
1956 r = sd_bus_process(bus, NULL);
1959 if (bus->state == BUS_RUNNING)
1964 r = sd_bus_wait(bus, (uint64_t) -1);
1970 _public_ int sd_bus_call(
1974 sd_bus_error *error,
1975 sd_bus_message **reply) {
1977 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1983 bus_assert_return(m, -EINVAL, error);
1984 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
1985 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
1986 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
1991 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
1992 bus_assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS, error);
1994 if (!BUS_IS_OPEN(bus->state)) {
1999 r = bus_ensure_running(bus);
2003 i = bus->rqueue_size;
2005 r = bus_seal_message(bus, m, usec);
2009 r = bus_remarshal_message(bus, &m);
2013 r = bus_send_internal(bus, m, &cookie, true);
2017 timeout = calc_elapse(m->timeout);
2022 while (i < bus->rqueue_size) {
2023 sd_bus_message *incoming = NULL;
2025 incoming = bus->rqueue[i];
2027 if (incoming->reply_cookie == cookie) {
2028 /* Found a match! */
2030 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2032 log_debug_bus_message(incoming);
2034 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2036 if (incoming->n_fds <= 0 || (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2040 sd_bus_message_unref(incoming);
2045 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2046 sd_bus_message_unref(incoming);
2049 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
2050 r = sd_bus_error_copy(error, &incoming->error);
2051 sd_bus_message_unref(incoming);
2058 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2061 streq(bus->unique_name, incoming->sender)) {
2063 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2066 /* Our own message? Somebody is trying
2067 * to send its own client a message,
2068 * let's not dead-lock, let's fail
2071 sd_bus_message_unref(incoming);
2076 /* Try to read more, right-away */
2080 r = bus_read_message(bus, false, 0);
2082 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2083 bus_enter_closing(bus);
2095 n = now(CLOCK_MONOTONIC);
2103 left = (uint64_t) -1;
2105 r = bus_poll(bus, true, left);
2113 r = dispatch_wqueue(bus);
2115 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2116 bus_enter_closing(bus);
2125 return sd_bus_error_set_errno(error, r);
2128 _public_ int sd_bus_get_fd(sd_bus *bus) {
2130 assert_return(bus, -EINVAL);
2131 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2132 assert_return(!bus_pid_changed(bus), -ECHILD);
2134 return bus->input_fd;
2137 _public_ int sd_bus_get_events(sd_bus *bus) {
2140 assert_return(bus, -EINVAL);
2141 assert_return(!bus_pid_changed(bus), -ECHILD);
2143 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2146 if (bus->state == BUS_OPENING)
2148 else if (bus->state == BUS_AUTHENTICATING) {
2150 if (bus_socket_auth_needs_write(bus))
2155 } else if (bus->state == BUS_RUNNING || bus->state == BUS_HELLO) {
2156 if (bus->rqueue_size <= 0)
2158 if (bus->wqueue_size > 0)
2165 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2166 struct reply_callback *c;
2168 assert_return(bus, -EINVAL);
2169 assert_return(timeout_usec, -EINVAL);
2170 assert_return(!bus_pid_changed(bus), -ECHILD);
2172 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2175 if (bus->track_queue) {
2180 if (bus->state == BUS_CLOSING) {
2185 if (bus->state == BUS_AUTHENTICATING) {
2186 *timeout_usec = bus->auth_timeout;
2190 if (bus->state != BUS_RUNNING && bus->state != BUS_HELLO) {
2191 *timeout_usec = (uint64_t) -1;
2195 if (bus->rqueue_size > 0) {
2200 c = prioq_peek(bus->reply_callbacks_prioq);
2202 *timeout_usec = (uint64_t) -1;
2206 if (c->timeout == 0) {
2207 *timeout_usec = (uint64_t) -1;
2211 *timeout_usec = c->timeout;
2215 static int process_timeout(sd_bus *bus) {
2216 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2217 _cleanup_bus_message_unref_ sd_bus_message* m = NULL;
2218 struct reply_callback *c;
2225 c = prioq_peek(bus->reply_callbacks_prioq);
2229 n = now(CLOCK_MONOTONIC);
2233 r = bus_message_new_synthetic_error(
2236 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2241 r = bus_seal_synthetic_message(bus, m);
2245 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2248 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2251 slot = container_of(c, sd_bus_slot, reply_callback);
2253 bus->iteration_counter ++;
2255 bus->current_message = m;
2256 bus->current_slot = sd_bus_slot_ref(slot);
2257 bus->current_handler = c->callback;
2258 bus->current_userdata = slot->userdata;
2259 r = c->callback(m, slot->userdata, &error_buffer);
2260 bus->current_userdata = NULL;
2261 bus->current_handler = NULL;
2262 bus->current_slot = NULL;
2263 bus->current_message = NULL;
2265 if (slot->floating) {
2266 bus_slot_disconnect(slot);
2267 sd_bus_slot_unref(slot);
2270 sd_bus_slot_unref(slot);
2272 return bus_maybe_reply_error(m, r, &error_buffer);
2275 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2279 if (bus->state != BUS_HELLO)
2282 /* Let's make sure the first message on the bus is the HELLO
2283 * reply. But note that we don't actually parse the message
2284 * here (we leave that to the usual handling), we just verify
2285 * we don't let any earlier msg through. */
2287 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2288 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2291 if (m->reply_cookie != 1)
2297 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2298 _cleanup_bus_message_unref_ sd_bus_message *synthetic_reply = NULL;
2299 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2300 struct reply_callback *c;
2307 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2308 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2311 if (bus->is_kernel && (bus->hello_flags & KDBUS_HELLO_MONITOR))
2314 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2317 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2323 slot = container_of(c, sd_bus_slot, reply_callback);
2325 if (m->n_fds > 0 && !(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2327 /* If the reply contained a file descriptor which we
2328 * didn't want we pass an error instead. */
2330 r = bus_message_new_synthetic_error(
2333 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2338 /* Copy over original timestamp */
2339 synthetic_reply->realtime = m->realtime;
2340 synthetic_reply->monotonic = m->monotonic;
2341 synthetic_reply->seqnum = m->seqnum;
2343 r = bus_seal_synthetic_message(bus, synthetic_reply);
2347 m = synthetic_reply;
2349 r = sd_bus_message_rewind(m, true);
2354 if (c->timeout != 0) {
2355 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2359 bus->current_slot = sd_bus_slot_ref(slot);
2360 bus->current_handler = c->callback;
2361 bus->current_userdata = slot->userdata;
2362 r = c->callback(m, slot->userdata, &error_buffer);
2363 bus->current_userdata = NULL;
2364 bus->current_handler = NULL;
2365 bus->current_slot = NULL;
2367 if (slot->floating) {
2368 bus_slot_disconnect(slot);
2369 sd_bus_slot_unref(slot);
2372 sd_bus_slot_unref(slot);
2374 return bus_maybe_reply_error(m, r, &error_buffer);
2377 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2378 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2379 struct filter_callback *l;
2386 bus->filter_callbacks_modified = false;
2388 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2391 if (bus->filter_callbacks_modified)
2394 /* Don't run this more than once per iteration */
2395 if (l->last_iteration == bus->iteration_counter)
2398 l->last_iteration = bus->iteration_counter;
2400 r = sd_bus_message_rewind(m, true);
2404 slot = container_of(l, sd_bus_slot, filter_callback);
2406 bus->current_slot = sd_bus_slot_ref(slot);
2407 bus->current_handler = l->callback;
2408 bus->current_userdata = slot->userdata;
2409 r = l->callback(m, slot->userdata, &error_buffer);
2410 bus->current_userdata = NULL;
2411 bus->current_handler = NULL;
2412 bus->current_slot = sd_bus_slot_unref(slot);
2414 r = bus_maybe_reply_error(m, r, &error_buffer);
2420 } while (bus->filter_callbacks_modified);
2425 static int process_match(sd_bus *bus, sd_bus_message *m) {
2432 bus->match_callbacks_modified = false;
2434 r = bus_match_run(bus, &bus->match_callbacks, m);
2438 } while (bus->match_callbacks_modified);
2443 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2444 _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
2450 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2453 if (bus->manual_peer_interface)
2456 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2459 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2462 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2465 if (streq_ptr(m->member, "Ping"))
2466 r = sd_bus_message_new_method_return(m, &reply);
2467 else if (streq_ptr(m->member, "GetMachineId")) {
2471 r = sd_id128_get_machine(&id);
2475 r = sd_bus_message_new_method_return(m, &reply);
2479 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2481 r = sd_bus_message_new_method_errorf(
2483 SD_BUS_ERROR_UNKNOWN_METHOD,
2484 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2490 r = sd_bus_send(bus, reply, NULL);
2497 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2501 /* If we got a message with a file descriptor which we didn't
2502 * want to accept, then let's drop it. How can this even
2503 * happen? For example, when the kernel queues a message into
2504 * an activatable names's queue which allows fds, and then is
2505 * delivered to us later even though we ourselves did not
2508 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2514 if (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)
2517 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2518 return 1; /* just eat it up */
2520 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2523 static int process_message(sd_bus *bus, sd_bus_message *m) {
2529 bus->current_message = m;
2530 bus->iteration_counter++;
2532 log_debug_bus_message(m);
2534 r = process_hello(bus, m);
2538 r = process_reply(bus, m);
2542 r = process_fd_check(bus, m);
2546 r = process_filter(bus, m);
2550 r = process_match(bus, m);
2554 r = process_builtin(bus, m);
2558 r = bus_process_object(bus, m);
2561 bus->current_message = NULL;
2565 static int dispatch_track(sd_bus *bus) {
2568 if (!bus->track_queue)
2571 bus_track_dispatch(bus->track_queue);
2575 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2576 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2580 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
2582 r = process_timeout(bus);
2586 r = dispatch_wqueue(bus);
2590 r = dispatch_track(bus);
2594 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2600 r = process_message(bus, m);
2605 r = sd_bus_message_rewind(m, true);
2614 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2616 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2617 strna(sd_bus_message_get_sender(m)),
2618 strna(sd_bus_message_get_path(m)),
2619 strna(sd_bus_message_get_interface(m)),
2620 strna(sd_bus_message_get_member(m)));
2622 r = sd_bus_reply_method_errorf(
2624 SD_BUS_ERROR_UNKNOWN_OBJECT,
2625 "Unknown object '%s'.", m->path);
2639 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2640 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2641 struct reply_callback *c;
2645 assert(bus->state == BUS_CLOSING);
2647 c = ordered_hashmap_first(bus->reply_callbacks);
2649 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2652 /* First, fail all outstanding method calls */
2653 r = bus_message_new_synthetic_error(
2656 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2661 r = bus_seal_synthetic_message(bus, m);
2665 if (c->timeout != 0) {
2666 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2670 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2673 slot = container_of(c, sd_bus_slot, reply_callback);
2675 bus->iteration_counter++;
2677 bus->current_message = m;
2678 bus->current_slot = sd_bus_slot_ref(slot);
2679 bus->current_handler = c->callback;
2680 bus->current_userdata = slot->userdata;
2681 r = c->callback(m, slot->userdata, &error_buffer);
2682 bus->current_userdata = NULL;
2683 bus->current_handler = NULL;
2684 bus->current_slot = NULL;
2685 bus->current_message = NULL;
2687 if (slot->floating) {
2688 bus_slot_disconnect(slot);
2689 sd_bus_slot_unref(slot);
2692 sd_bus_slot_unref(slot);
2694 return bus_maybe_reply_error(m, r, &error_buffer);
2697 /* Then, synthesize a Disconnected message */
2698 r = sd_bus_message_new_signal(
2701 "/org/freedesktop/DBus/Local",
2702 "org.freedesktop.DBus.Local",
2707 bus_message_set_sender_local(bus, m);
2709 r = bus_seal_synthetic_message(bus, m);
2715 bus->current_message = m;
2716 bus->iteration_counter++;
2718 r = process_filter(bus, m);
2722 r = process_match(bus, m);
2734 bus->current_message = NULL;
2739 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2740 BUS_DONT_DESTROY(bus);
2743 /* Returns 0 when we didn't do anything. This should cause the
2744 * caller to invoke sd_bus_wait() before returning the next
2745 * time. Returns > 0 when we did something, which possibly
2746 * means *ret is filled in with an unprocessed message. */
2748 assert_return(bus, -EINVAL);
2749 assert_return(!bus_pid_changed(bus), -ECHILD);
2751 /* We don't allow recursively invoking sd_bus_process(). */
2752 assert_return(!bus->current_message, -EBUSY);
2753 assert(!bus->current_slot);
2755 switch (bus->state) {
2764 r = bus_socket_process_opening(bus);
2765 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2766 bus_enter_closing(bus);
2774 case BUS_AUTHENTICATING:
2775 r = bus_socket_process_authenticating(bus);
2776 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2777 bus_enter_closing(bus);
2789 r = process_running(bus, hint_priority, priority, ret);
2790 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2791 bus_enter_closing(bus);
2801 return process_closing(bus, ret);
2804 assert_not_reached("Unknown state");
2807 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2808 return bus_process_internal(bus, false, 0, ret);
2811 /// UNNEEDED by elogind
2813 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2814 return bus_process_internal(bus, true, priority, ret);
2818 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2819 struct pollfd p[2] = {};
2822 usec_t m = USEC_INFINITY;
2826 if (bus->state == BUS_CLOSING)
2829 if (!BUS_IS_OPEN(bus->state))
2832 e = sd_bus_get_events(bus);
2837 /* The caller really needs some more data, he doesn't
2838 * care about what's already read, or any timeouts
2839 * except its own. */
2843 /* The caller wants to process if there's something to
2844 * process, but doesn't care otherwise */
2846 r = sd_bus_get_timeout(bus, &until);
2851 nw = now(CLOCK_MONOTONIC);
2852 m = until > nw ? until - nw : 0;
2856 if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
2859 p[0].fd = bus->input_fd;
2860 if (bus->output_fd == bus->input_fd) {
2864 p[0].events = e & POLLIN;
2865 p[1].fd = bus->output_fd;
2866 p[1].events = e & POLLOUT;
2870 r = ppoll(p, n, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
2874 return r > 0 ? 1 : 0;
2877 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2879 assert_return(bus, -EINVAL);
2880 assert_return(!bus_pid_changed(bus), -ECHILD);
2882 if (bus->state == BUS_CLOSING)
2885 if (!BUS_IS_OPEN(bus->state))
2888 if (bus->rqueue_size > 0)
2891 return bus_poll(bus, false, timeout_usec);
2894 _public_ int sd_bus_flush(sd_bus *bus) {
2897 assert_return(bus, -EINVAL);
2898 assert_return(!bus_pid_changed(bus), -ECHILD);
2900 if (bus->state == BUS_CLOSING)
2903 if (!BUS_IS_OPEN(bus->state))
2906 r = bus_ensure_running(bus);
2910 if (bus->wqueue_size <= 0)
2914 r = dispatch_wqueue(bus);
2916 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2917 bus_enter_closing(bus);
2924 if (bus->wqueue_size <= 0)
2927 r = bus_poll(bus, false, (uint64_t) -1);
2933 _public_ int sd_bus_add_filter(
2936 sd_bus_message_handler_t callback,
2941 assert_return(bus, -EINVAL);
2942 assert_return(callback, -EINVAL);
2943 assert_return(!bus_pid_changed(bus), -ECHILD);
2945 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
2949 s->filter_callback.callback = callback;
2951 bus->filter_callbacks_modified = true;
2952 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
2960 _public_ int sd_bus_add_match(
2964 sd_bus_message_handler_t callback,
2967 struct bus_match_component *components = NULL;
2968 unsigned n_components = 0;
2969 sd_bus_slot *s = NULL;
2972 assert_return(bus, -EINVAL);
2973 assert_return(match, -EINVAL);
2974 assert_return(!bus_pid_changed(bus), -ECHILD);
2976 r = bus_match_parse(match, &components, &n_components);
2980 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
2986 s->match_callback.callback = callback;
2987 s->match_callback.cookie = ++bus->match_cookie;
2989 if (bus->bus_client) {
2990 enum bus_match_scope scope;
2992 scope = bus_match_get_scope(components, n_components);
2994 /* Do not install server-side matches for matches
2995 * against the local service, interface or bus
2997 if (scope != BUS_MATCH_LOCAL) {
2999 if (!bus->is_kernel) {
3000 /* When this is not a kernel transport, we
3001 * store the original match string, so that we
3002 * can use it to remove the match again */
3004 s->match_callback.match_string = strdup(match);
3005 if (!s->match_callback.match_string) {
3011 r = bus_add_match_internal(bus, s->match_callback.match_string, components, n_components, s->match_callback.cookie);
3015 s->match_added = true;
3019 bus->match_callbacks_modified = true;
3020 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3029 bus_match_parse_free(components, n_components);
3030 sd_bus_slot_unref(s);
3035 /// UNNEEDED by elogind
3037 int bus_remove_match_by_string(
3040 sd_bus_message_handler_t callback,
3043 struct bus_match_component *components = NULL;
3044 unsigned n_components = 0;
3045 struct match_callback *c;
3048 assert_return(bus, -EINVAL);
3049 assert_return(match, -EINVAL);
3050 assert_return(!bus_pid_changed(bus), -ECHILD);
3052 r = bus_match_parse(match, &components, &n_components);
3056 r = bus_match_find(&bus->match_callbacks, components, n_components, NULL, NULL, &c);
3060 sd_bus_slot_unref(container_of(c, sd_bus_slot, match_callback));
3063 bus_match_parse_free(components, n_components);
3069 bool bus_pid_changed(sd_bus *bus) {
3072 /* We don't support people creating a bus connection and
3073 * keeping it around over a fork(). Let's complain. */
3075 return bus->original_pid != getpid();
3078 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3079 sd_bus *bus = userdata;
3084 r = sd_bus_process(bus, NULL);
3091 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3092 sd_bus *bus = userdata;
3097 r = sd_bus_process(bus, NULL);
3104 static int prepare_callback(sd_event_source *s, void *userdata) {
3105 sd_bus *bus = userdata;
3112 e = sd_bus_get_events(bus);
3116 if (bus->output_fd != bus->input_fd) {
3118 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3122 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3126 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3131 r = sd_bus_get_timeout(bus, &until);
3137 j = sd_event_source_set_time(bus->time_event_source, until);
3142 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3149 static int quit_callback(sd_event_source *event, void *userdata) {
3150 sd_bus *bus = userdata;
3160 static int attach_io_events(sd_bus *bus) {
3165 if (bus->input_fd < 0)
3171 if (!bus->input_io_event_source) {
3172 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3176 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3180 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3184 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3186 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3191 if (bus->output_fd != bus->input_fd) {
3192 assert(bus->output_fd >= 0);
3194 if (!bus->output_io_event_source) {
3195 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3199 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3203 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3205 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3214 static void detach_io_events(sd_bus *bus) {
3217 if (bus->input_io_event_source) {
3218 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3219 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3222 if (bus->output_io_event_source) {
3223 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3224 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3228 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3231 assert_return(bus, -EINVAL);
3232 assert_return(!bus->event, -EBUSY);
3234 assert(!bus->input_io_event_source);
3235 assert(!bus->output_io_event_source);
3236 assert(!bus->time_event_source);
3239 bus->event = sd_event_ref(event);
3241 r = sd_event_default(&bus->event);
3246 bus->event_priority = priority;
3248 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3252 r = sd_event_source_set_priority(bus->time_event_source, priority);
3256 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3260 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3264 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3268 r = attach_io_events(bus);
3275 sd_bus_detach_event(bus);
3279 _public_ int sd_bus_detach_event(sd_bus *bus) {
3280 assert_return(bus, -EINVAL);
3285 detach_io_events(bus);
3287 if (bus->time_event_source) {
3288 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3289 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3292 if (bus->quit_event_source) {
3293 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3294 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3297 bus->event = sd_event_unref(bus->event);
3301 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3302 assert_return(bus, NULL);
3307 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3308 assert_return(bus, NULL);
3310 return bus->current_message;
3313 /// UNNEEDED by elogind
3315 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3316 assert_return(bus, NULL);
3318 return bus->current_slot;
3322 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3323 assert_return(bus, NULL);
3325 return bus->current_handler;
3328 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3329 assert_return(bus, NULL);
3331 return bus->current_userdata;
3334 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3339 assert(default_bus);
3342 return !!*default_bus;
3345 *ret = sd_bus_ref(*default_bus);
3353 b->default_bus_ptr = default_bus;
3361 _public_ int sd_bus_default_system(sd_bus **ret) {
3362 static thread_local sd_bus *default_system_bus = NULL;
3364 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3367 _public_ int sd_bus_default_user(sd_bus **ret) {
3368 static thread_local sd_bus *default_user_bus = NULL;
3370 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3373 _public_ int sd_bus_default(sd_bus **ret) {
3377 /* Let's try our best to reuse another cached connection. If
3378 * the starter bus type is set, connect via our normal
3379 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3380 * we can share the connection with the user/system default
3383 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3385 if (streq(e, "system"))
3386 return sd_bus_default_system(ret);
3387 else if (STR_IN_SET(e, "user", "session"))
3388 return sd_bus_default_user(ret);
3391 /* No type is specified, so we have not other option than to
3392 * use the starter address if it is set. */
3394 e = secure_getenv("DBUS_STARTER_ADDRESS");
3396 static thread_local sd_bus *default_starter_bus = NULL;
3398 return bus_default(sd_bus_open, &default_starter_bus, ret);
3401 /* Finally, if nothing is set use the cached connection for
3402 * the right scope */
3404 if (cg_pid_get_owner_uid(0, NULL) >= 0)
3405 return sd_bus_default_user(ret);
3407 return sd_bus_default_system(ret);
3410 /// UNNEEDED by elogind
3412 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3413 assert_return(b, -EINVAL);
3414 assert_return(tid, -EINVAL);
3415 assert_return(!bus_pid_changed(b), -ECHILD);
3423 return sd_event_get_tid(b->event, tid);
3428 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3429 _cleanup_free_ char *e = NULL;
3432 assert_return(object_path_is_valid(prefix), -EINVAL);
3433 assert_return(external_id, -EINVAL);
3434 assert_return(ret_path, -EINVAL);
3436 e = bus_label_escape(external_id);
3440 ret = strjoin(prefix, "/", e, NULL);
3448 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3452 assert_return(object_path_is_valid(path), -EINVAL);
3453 assert_return(object_path_is_valid(prefix), -EINVAL);
3454 assert_return(external_id, -EINVAL);
3456 e = object_path_startswith(path, prefix);
3458 *external_id = NULL;
3462 ret = bus_label_unescape(e);
3471 _public_ int sd_bus_try_close(sd_bus *bus) {
3474 assert_return(bus, -EINVAL);
3475 assert_return(!bus_pid_changed(bus), -ECHILD);
3477 if (!bus->is_kernel)
3480 if (!BUS_IS_OPEN(bus->state))
3483 if (bus->rqueue_size > 0)
3486 if (bus->wqueue_size > 0)
3489 r = bus_kernel_try_close(bus);
3497 /// UNNEEDED by elogind
3499 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3500 assert_return(bus, -EINVAL);
3501 assert_return(description, -EINVAL);
3502 assert_return(bus->description, -ENXIO);
3503 assert_return(!bus_pid_changed(bus), -ECHILD);
3505 *description = bus->description;
3510 int bus_get_root_path(sd_bus *bus) {
3513 if (bus->cgroup_root)
3516 r = cg_get_root_path(&bus->cgroup_root);
3518 bus->cgroup_root = strdup("/");
3519 if (!bus->cgroup_root)
3528 /// UNNEEDED by elogind
3530 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3533 assert_return(bus, -EINVAL);
3534 assert_return(scope, -EINVAL);
3535 assert_return(!bus_pid_changed(bus), -ECHILD);
3537 if (bus->is_kernel) {
3538 _cleanup_free_ char *n = NULL;
3541 r = bus_kernel_get_bus_name(bus, &n);
3545 if (streq(n, "0-system")) {
3550 dash = strchr(n, '-');
3551 if (streq_ptr(dash, "-user")) {
3562 if (bus->is_system) {
3570 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3572 assert_return(bus, -EINVAL);
3573 assert_return(address, -EINVAL);
3574 assert_return(!bus_pid_changed(bus), -ECHILD);
3577 *address = bus->address;
3584 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
3585 assert_return(bus, -EINVAL);
3586 assert_return(mask, -EINVAL);
3587 assert_return(!bus_pid_changed(bus), -ECHILD);
3589 *mask = bus->creds_mask;
3593 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
3594 assert_return(bus, -EINVAL);
3595 assert_return(!bus_pid_changed(bus), -ECHILD);
3597 return bus->bus_client;
3600 _public_ int sd_bus_is_server(sd_bus *bus) {
3601 assert_return(bus, -EINVAL);
3602 assert_return(!bus_pid_changed(bus), -ECHILD);
3604 return bus->is_server;
3607 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
3608 assert_return(bus, -EINVAL);
3609 assert_return(!bus_pid_changed(bus), -ECHILD);
3611 return bus->anonymous_auth;
3614 _public_ int sd_bus_is_trusted(sd_bus *bus) {
3615 assert_return(bus, -EINVAL);
3616 assert_return(!bus_pid_changed(bus), -ECHILD);
3618 return bus->trusted;
3621 _public_ int sd_bus_is_monitor(sd_bus *bus) {
3622 assert_return(bus, -EINVAL);
3623 assert_return(!bus_pid_changed(bus), -ECHILD);
3625 return !!(bus->hello_flags & KDBUS_HELLO_MONITOR);