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);
1038 else if ((b->nspid > 0 || b->machine) && b->kernel) {
1039 r = bus_container_connect_kernel(b);
1040 if (r < 0 && !IN_SET(r, -ENOENT, -ESOCKTNOSUPPORT))
1041 container_kdbus_available = true;
1043 } else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC) {
1044 if (!container_kdbus_available)
1045 r = bus_container_connect_socket(b);
1049 } else if (b->kernel) {
1050 r = bus_kernel_connect(b);
1051 if (r < 0 && !IN_SET(r, -ENOENT, -ESOCKTNOSUPPORT))
1052 kdbus_available = true;
1054 } else if (b->sockaddr.sa.sa_family != AF_UNSPEC) {
1055 if (!kdbus_available)
1056 r = bus_socket_connect(b);
1065 r = attach_io_events(b);
1070 b->last_connect_error = -r;
1073 r = bus_parse_next_address(b);
1077 return b->last_connect_error ? -b->last_connect_error : -ECONNREFUSED;
1081 int bus_next_address(sd_bus *b) {
1084 bus_reset_parsed_address(b);
1085 return bus_start_address(b);
1088 static int bus_start_fd(sd_bus *b) {
1093 assert(b->input_fd >= 0);
1094 assert(b->output_fd >= 0);
1096 r = fd_nonblock(b->input_fd, true);
1100 r = fd_cloexec(b->input_fd, true);
1104 if (b->input_fd != b->output_fd) {
1105 r = fd_nonblock(b->output_fd, true);
1109 r = fd_cloexec(b->output_fd, true);
1114 if (fstat(b->input_fd, &st) < 0)
1117 if (S_ISCHR(b->input_fd))
1118 return bus_kernel_take_fd(b);
1120 return bus_socket_take_fd(b);
1123 _public_ int sd_bus_start(sd_bus *bus) {
1126 assert_return(bus, -EINVAL);
1127 assert_return(bus->state == BUS_UNSET, -EPERM);
1128 assert_return(!bus_pid_changed(bus), -ECHILD);
1130 bus->state = BUS_OPENING;
1132 if (bus->is_server && bus->bus_client)
1135 if (bus->input_fd >= 0)
1136 r = bus_start_fd(bus);
1137 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->kernel || bus->machine)
1138 r = bus_start_address(bus);
1147 return bus_send_hello(bus);
1150 _public_ int sd_bus_open(sd_bus **ret) {
1155 assert_return(ret, -EINVAL);
1157 /* Let's connect to the starter bus if it is set, and
1158 * otherwise to the bus that is appropropriate for the scope
1159 * we are running in */
1161 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1163 if (streq(e, "system"))
1164 return sd_bus_open_system(ret);
1165 else if (STR_IN_SET(e, "session", "user"))
1166 return sd_bus_open_user(ret);
1169 e = secure_getenv("DBUS_STARTER_ADDRESS");
1171 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1172 return sd_bus_open_user(ret);
1174 return sd_bus_open_system(ret);
1181 r = sd_bus_set_address(b, e);
1185 b->bus_client = true;
1187 /* We don't know whether the bus is trusted or not, so better
1188 * be safe, and authenticate everything */
1190 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1191 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1193 r = sd_bus_start(b);
1205 int bus_set_address_system(sd_bus *b) {
1209 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1211 return sd_bus_set_address(b, e);
1213 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1216 _public_ int sd_bus_open_system(sd_bus **ret) {
1220 assert_return(ret, -EINVAL);
1226 r = bus_set_address_system(b);
1230 b->bus_client = true;
1231 b->is_system = true;
1233 /* Let's do per-method access control on the system bus. We
1234 * need the caller's UID and capability set for that. */
1236 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1237 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1239 r = sd_bus_start(b);
1251 int bus_set_address_user(sd_bus *b) {
1256 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1258 return sd_bus_set_address(b, e);
1260 e = secure_getenv("XDG_RUNTIME_DIR");
1262 _cleanup_free_ char *ee = NULL;
1264 ee = bus_address_escape(e);
1268 (void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT ";" UNIX_USER_BUS_ADDRESS_FMT, getuid(), ee);
1270 (void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT, getuid());
1278 _public_ int sd_bus_open_user(sd_bus **ret) {
1282 assert_return(ret, -EINVAL);
1288 r = bus_set_address_user(b);
1292 b->bus_client = true;
1295 /* We don't do any per-method access control on the user
1299 r = sd_bus_start(b);
1311 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1312 _cleanup_free_ char *e = NULL;
1313 char *m = NULL, *c = NULL;
1318 /* Let's see if we shall enter some container */
1319 m = strchr(host, ':');
1323 /* Let's make sure this is not a port of some kind,
1324 * and is a valid machine name. */
1325 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1328 /* Cut out the host part */
1329 t = strndupa(host, m - host - 1);
1330 e = bus_address_escape(t);
1334 c = strjoina(",argv4=--machine=", m);
1339 e = bus_address_escape(host);
1344 b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e, ",argv3=systemd-stdio-bridge", c, NULL);
1351 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1355 assert_return(host, -EINVAL);
1356 assert_return(ret, -EINVAL);
1358 r = sd_bus_new(&bus);
1362 r = bus_set_address_system_remote(bus, host);
1366 bus->bus_client = true;
1367 bus->trusted = false;
1368 bus->is_system = true;
1370 r = sd_bus_start(bus);
1382 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1383 _cleanup_free_ char *e = NULL;
1388 e = bus_address_escape(machine);
1392 b->address = strjoin("x-machine-kernel:machine=", e, ";x-machine-unix:machine=", e, NULL);
1399 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1403 assert_return(machine, -EINVAL);
1404 assert_return(ret, -EINVAL);
1405 assert_return(machine_name_is_valid(machine), -EINVAL);
1407 r = sd_bus_new(&bus);
1411 r = bus_set_address_system_machine(bus, machine);
1415 bus->bus_client = true;
1416 bus->trusted = false;
1417 bus->is_system = true;
1419 r = sd_bus_start(bus);
1431 _public_ void sd_bus_close(sd_bus *bus) {
1435 if (bus->state == BUS_CLOSED)
1437 if (bus_pid_changed(bus))
1440 bus->state = BUS_CLOSED;
1442 sd_bus_detach_event(bus);
1444 /* Drop all queued messages so that they drop references to
1445 * the bus object and the bus may be freed */
1446 bus_reset_queues(bus);
1448 if (!bus->is_kernel)
1451 /* We'll leave the fd open in case this is a kernel bus, since
1452 * there might still be memblocks around that reference this
1453 * bus, and they might need to invoke the KDBUS_CMD_FREE
1454 * ioctl on the fd when they are freed. */
1457 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1465 return sd_bus_unref(bus);
1468 static void bus_enter_closing(sd_bus *bus) {
1471 if (bus->state != BUS_OPENING &&
1472 bus->state != BUS_AUTHENTICATING &&
1473 bus->state != BUS_HELLO &&
1474 bus->state != BUS_RUNNING)
1477 bus->state = BUS_CLOSING;
1480 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1481 assert_return(bus, NULL);
1483 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1488 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1494 i = REFCNT_DEC(bus->n_ref);
1502 /// UNNEEDED by elogind
1504 _public_ int sd_bus_is_open(sd_bus *bus) {
1506 assert_return(bus, -EINVAL);
1507 assert_return(!bus_pid_changed(bus), -ECHILD);
1509 return BUS_IS_OPEN(bus->state);
1513 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1516 assert_return(bus, -EINVAL);
1517 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1518 assert_return(!bus_pid_changed(bus), -ECHILD);
1520 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
1523 if (type == SD_BUS_TYPE_UNIX_FD) {
1524 if (!(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD))
1527 r = bus_ensure_running(bus);
1531 return bus->can_fds;
1534 return bus_type_is_valid(type);
1537 /// UNNEEDED by elogind
1539 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1542 assert_return(bus, -EINVAL);
1543 assert_return(id, -EINVAL);
1544 assert_return(!bus_pid_changed(bus), -ECHILD);
1546 r = bus_ensure_running(bus);
1550 *id = bus->server_id;
1555 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1560 /* If we copy the same message to multiple
1561 * destinations, avoid using the same cookie
1563 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1568 timeout = BUS_DEFAULT_TIMEOUT;
1570 return bus_message_seal(m, ++b->cookie, timeout);
1573 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1574 bool remarshal = false;
1578 /* wrong packet version */
1579 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1582 /* wrong packet endianness */
1583 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1586 /* TODO: kdbus-messages received from the kernel contain data which is
1587 * not allowed to be passed to KDBUS_CMD_SEND. Therefore, we have to
1588 * force remarshaling of the message. Technically, we could just
1589 * recreate the kdbus message, but that is non-trivial as other parts of
1590 * the message refer to m->kdbus already. This should be fixed! */
1591 if ((*m)->kdbus && (*m)->release_kdbus)
1594 return remarshal ? bus_message_remarshal(b, m) : 0;
1597 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1601 /* Fake some timestamps, if they were requested, and not
1602 * already initialized */
1603 if (b->attach_flags & KDBUS_ATTACH_TIMESTAMP) {
1604 if (m->realtime <= 0)
1605 m->realtime = now(CLOCK_REALTIME);
1607 if (m->monotonic <= 0)
1608 m->monotonic = now(CLOCK_MONOTONIC);
1611 /* The bus specification says the serial number cannot be 0,
1612 * hence let's fill something in for synthetic messages. Since
1613 * synthetic messages might have a fake sender and we don't
1614 * want to interfere with the real sender's serial numbers we
1615 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1616 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1617 * even though kdbus can do 64bit. */
1618 return bus_message_seal(m, 0xFFFFFFFFULL, 0);
1621 static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
1628 r = bus_kernel_write_message(bus, m, hint_sync_call);
1630 r = bus_socket_write_message(bus, m, idx);
1635 if (bus->is_kernel || *idx >= BUS_MESSAGE_SIZE(m))
1636 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
1637 bus_message_type_to_string(m->header->type),
1638 strna(sd_bus_message_get_sender(m)),
1639 strna(sd_bus_message_get_destination(m)),
1640 strna(sd_bus_message_get_path(m)),
1641 strna(sd_bus_message_get_interface(m)),
1642 strna(sd_bus_message_get_member(m)),
1643 BUS_MESSAGE_COOKIE(m),
1645 strna(m->error.message));
1650 static int dispatch_wqueue(sd_bus *bus) {
1654 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1656 while (bus->wqueue_size > 0) {
1658 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
1662 /* Didn't do anything this time */
1664 else if (bus->is_kernel || bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1665 /* Fully written. Let's drop the entry from
1668 * This isn't particularly optimized, but
1669 * well, this is supposed to be our worst-case
1670 * buffer only, and the socket buffer is
1671 * supposed to be our primary buffer, and if
1672 * it got full, then all bets are off
1675 bus->wqueue_size --;
1676 sd_bus_message_unref(bus->wqueue[0]);
1677 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1687 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1691 return bus_kernel_read_message(bus, hint_priority, priority);
1693 return bus_socket_read_message(bus);
1696 int bus_rqueue_make_room(sd_bus *bus) {
1699 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1702 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1708 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1713 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1715 /* Note that the priority logic is only available on kdbus,
1716 * where the rqueue is unused. We check the rqueue here
1717 * anyway, because it's simple... */
1720 if (bus->rqueue_size > 0) {
1721 /* Dispatch a queued message */
1723 *m = bus->rqueue[0];
1724 bus->rqueue_size --;
1725 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1729 /* Try to read a new message */
1730 r = bus_read_message(bus, hint_priority, priority);
1740 static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
1741 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1744 assert_return(m, -EINVAL);
1749 assert_return(!bus_pid_changed(bus), -ECHILD);
1750 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1752 if (!BUS_IS_OPEN(bus->state))
1756 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1763 /* If the cookie number isn't kept, then we know that no reply
1765 if (!cookie && !m->sealed)
1766 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1768 r = bus_seal_message(bus, m, 0);
1772 /* Remarshall if we have to. This will possibly unref the
1773 * message and place a replacement in m */
1774 r = bus_remarshal_message(bus, &m);
1778 /* If this is a reply and no reply was requested, then let's
1779 * suppress this, if we can */
1783 if ((bus->state == BUS_RUNNING || bus->state == BUS_HELLO) && bus->wqueue_size <= 0) {
1786 r = bus_write_message(bus, m, hint_sync_call, &idx);
1788 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1789 bus_enter_closing(bus);
1796 if (!bus->is_kernel && idx < BUS_MESSAGE_SIZE(m)) {
1797 /* Wasn't fully written. So let's remember how
1798 * much was written. Note that the first entry
1799 * of the wqueue array is always allocated so
1800 * that we always can remember how much was
1802 bus->wqueue[0] = sd_bus_message_ref(m);
1803 bus->wqueue_size = 1;
1808 /* Just append it to the queue. */
1810 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1813 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1816 bus->wqueue[bus->wqueue_size ++] = sd_bus_message_ref(m);
1821 *cookie = BUS_MESSAGE_COOKIE(m);
1826 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1827 return bus_send_internal(bus, m, cookie, false);
1830 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1833 assert_return(m, -EINVAL);
1838 assert_return(!bus_pid_changed(bus), -ECHILD);
1840 if (!BUS_IS_OPEN(bus->state))
1843 if (!streq_ptr(m->destination, destination)) {
1848 r = sd_bus_message_set_destination(m, destination);
1853 return sd_bus_send(bus, m, cookie);
1856 static usec_t calc_elapse(uint64_t usec) {
1857 if (usec == (uint64_t) -1)
1860 return now(CLOCK_MONOTONIC) + usec;
1863 static int timeout_compare(const void *a, const void *b) {
1864 const struct reply_callback *x = a, *y = b;
1866 if (x->timeout != 0 && y->timeout == 0)
1869 if (x->timeout == 0 && y->timeout != 0)
1872 if (x->timeout < y->timeout)
1875 if (x->timeout > y->timeout)
1881 _public_ int sd_bus_call_async(
1885 sd_bus_message_handler_t callback,
1889 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1890 _cleanup_bus_slot_unref_ sd_bus_slot *s = NULL;
1893 assert_return(m, -EINVAL);
1894 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1895 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1896 assert_return(callback, -EINVAL);
1901 assert_return(!bus_pid_changed(bus), -ECHILD);
1902 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1904 if (!BUS_IS_OPEN(bus->state))
1907 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
1911 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1915 r = bus_seal_message(bus, m, usec);
1919 r = bus_remarshal_message(bus, &m);
1923 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
1927 s->reply_callback.callback = callback;
1929 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
1930 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
1932 s->reply_callback.cookie = 0;
1936 s->reply_callback.timeout = calc_elapse(m->timeout);
1937 if (s->reply_callback.timeout != 0) {
1938 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
1940 s->reply_callback.timeout = 0;
1945 r = sd_bus_send(bus, m, &s->reply_callback.cookie);
1956 int bus_ensure_running(sd_bus *bus) {
1961 if (bus->state == BUS_UNSET || bus->state == BUS_CLOSED || bus->state == BUS_CLOSING)
1963 if (bus->state == BUS_RUNNING)
1967 r = sd_bus_process(bus, NULL);
1970 if (bus->state == BUS_RUNNING)
1975 r = sd_bus_wait(bus, (uint64_t) -1);
1981 _public_ int sd_bus_call(
1985 sd_bus_error *error,
1986 sd_bus_message **reply) {
1988 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1994 bus_assert_return(m, -EINVAL, error);
1995 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
1996 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
1997 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
2002 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
2003 bus_assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS, error);
2005 if (!BUS_IS_OPEN(bus->state)) {
2010 r = bus_ensure_running(bus);
2014 i = bus->rqueue_size;
2016 r = bus_seal_message(bus, m, usec);
2020 r = bus_remarshal_message(bus, &m);
2024 r = bus_send_internal(bus, m, &cookie, true);
2028 timeout = calc_elapse(m->timeout);
2033 while (i < bus->rqueue_size) {
2034 sd_bus_message *incoming = NULL;
2036 incoming = bus->rqueue[i];
2038 if (incoming->reply_cookie == cookie) {
2039 /* Found a match! */
2041 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2043 log_debug_bus_message(incoming);
2045 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2047 if (incoming->n_fds <= 0 || (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2051 sd_bus_message_unref(incoming);
2056 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2057 sd_bus_message_unref(incoming);
2060 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
2061 r = sd_bus_error_copy(error, &incoming->error);
2062 sd_bus_message_unref(incoming);
2069 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2072 streq(bus->unique_name, incoming->sender)) {
2074 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2077 /* Our own message? Somebody is trying
2078 * to send its own client a message,
2079 * let's not dead-lock, let's fail
2082 sd_bus_message_unref(incoming);
2087 /* Try to read more, right-away */
2091 r = bus_read_message(bus, false, 0);
2093 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2094 bus_enter_closing(bus);
2106 n = now(CLOCK_MONOTONIC);
2114 left = (uint64_t) -1;
2116 r = bus_poll(bus, true, left);
2124 r = dispatch_wqueue(bus);
2126 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2127 bus_enter_closing(bus);
2136 return sd_bus_error_set_errno(error, r);
2139 _public_ int sd_bus_get_fd(sd_bus *bus) {
2141 assert_return(bus, -EINVAL);
2142 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2143 assert_return(!bus_pid_changed(bus), -ECHILD);
2145 return bus->input_fd;
2148 _public_ int sd_bus_get_events(sd_bus *bus) {
2151 assert_return(bus, -EINVAL);
2152 assert_return(!bus_pid_changed(bus), -ECHILD);
2154 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2157 if (bus->state == BUS_OPENING)
2159 else if (bus->state == BUS_AUTHENTICATING) {
2161 if (bus_socket_auth_needs_write(bus))
2166 } else if (bus->state == BUS_RUNNING || bus->state == BUS_HELLO) {
2167 if (bus->rqueue_size <= 0)
2169 if (bus->wqueue_size > 0)
2176 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2177 struct reply_callback *c;
2179 assert_return(bus, -EINVAL);
2180 assert_return(timeout_usec, -EINVAL);
2181 assert_return(!bus_pid_changed(bus), -ECHILD);
2183 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2186 if (bus->track_queue) {
2191 if (bus->state == BUS_CLOSING) {
2196 if (bus->state == BUS_AUTHENTICATING) {
2197 *timeout_usec = bus->auth_timeout;
2201 if (bus->state != BUS_RUNNING && bus->state != BUS_HELLO) {
2202 *timeout_usec = (uint64_t) -1;
2206 if (bus->rqueue_size > 0) {
2211 c = prioq_peek(bus->reply_callbacks_prioq);
2213 *timeout_usec = (uint64_t) -1;
2217 if (c->timeout == 0) {
2218 *timeout_usec = (uint64_t) -1;
2222 *timeout_usec = c->timeout;
2226 static int process_timeout(sd_bus *bus) {
2227 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2228 _cleanup_bus_message_unref_ sd_bus_message* m = NULL;
2229 struct reply_callback *c;
2236 c = prioq_peek(bus->reply_callbacks_prioq);
2240 n = now(CLOCK_MONOTONIC);
2244 r = bus_message_new_synthetic_error(
2247 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2252 r = bus_seal_synthetic_message(bus, m);
2256 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2259 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2262 slot = container_of(c, sd_bus_slot, reply_callback);
2264 bus->iteration_counter ++;
2266 bus->current_message = m;
2267 bus->current_slot = sd_bus_slot_ref(slot);
2268 bus->current_handler = c->callback;
2269 bus->current_userdata = slot->userdata;
2270 r = c->callback(m, slot->userdata, &error_buffer);
2271 bus->current_userdata = NULL;
2272 bus->current_handler = NULL;
2273 bus->current_slot = NULL;
2274 bus->current_message = NULL;
2276 if (slot->floating) {
2277 bus_slot_disconnect(slot);
2278 sd_bus_slot_unref(slot);
2281 sd_bus_slot_unref(slot);
2283 return bus_maybe_reply_error(m, r, &error_buffer);
2286 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2290 if (bus->state != BUS_HELLO)
2293 /* Let's make sure the first message on the bus is the HELLO
2294 * reply. But note that we don't actually parse the message
2295 * here (we leave that to the usual handling), we just verify
2296 * we don't let any earlier msg through. */
2298 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2299 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2302 if (m->reply_cookie != 1)
2308 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2309 _cleanup_bus_message_unref_ sd_bus_message *synthetic_reply = NULL;
2310 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2311 struct reply_callback *c;
2318 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2319 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2322 if (bus->is_kernel && (bus->hello_flags & KDBUS_HELLO_MONITOR))
2325 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2328 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2334 slot = container_of(c, sd_bus_slot, reply_callback);
2336 if (m->n_fds > 0 && !(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2338 /* If the reply contained a file descriptor which we
2339 * didn't want we pass an error instead. */
2341 r = bus_message_new_synthetic_error(
2344 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2349 /* Copy over original timestamp */
2350 synthetic_reply->realtime = m->realtime;
2351 synthetic_reply->monotonic = m->monotonic;
2352 synthetic_reply->seqnum = m->seqnum;
2354 r = bus_seal_synthetic_message(bus, synthetic_reply);
2358 m = synthetic_reply;
2360 r = sd_bus_message_rewind(m, true);
2365 if (c->timeout != 0) {
2366 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2370 bus->current_slot = sd_bus_slot_ref(slot);
2371 bus->current_handler = c->callback;
2372 bus->current_userdata = slot->userdata;
2373 r = c->callback(m, slot->userdata, &error_buffer);
2374 bus->current_userdata = NULL;
2375 bus->current_handler = NULL;
2376 bus->current_slot = NULL;
2378 if (slot->floating) {
2379 bus_slot_disconnect(slot);
2380 sd_bus_slot_unref(slot);
2383 sd_bus_slot_unref(slot);
2385 return bus_maybe_reply_error(m, r, &error_buffer);
2388 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2389 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2390 struct filter_callback *l;
2397 bus->filter_callbacks_modified = false;
2399 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2402 if (bus->filter_callbacks_modified)
2405 /* Don't run this more than once per iteration */
2406 if (l->last_iteration == bus->iteration_counter)
2409 l->last_iteration = bus->iteration_counter;
2411 r = sd_bus_message_rewind(m, true);
2415 slot = container_of(l, sd_bus_slot, filter_callback);
2417 bus->current_slot = sd_bus_slot_ref(slot);
2418 bus->current_handler = l->callback;
2419 bus->current_userdata = slot->userdata;
2420 r = l->callback(m, slot->userdata, &error_buffer);
2421 bus->current_userdata = NULL;
2422 bus->current_handler = NULL;
2423 bus->current_slot = sd_bus_slot_unref(slot);
2425 r = bus_maybe_reply_error(m, r, &error_buffer);
2431 } while (bus->filter_callbacks_modified);
2436 static int process_match(sd_bus *bus, sd_bus_message *m) {
2443 bus->match_callbacks_modified = false;
2445 r = bus_match_run(bus, &bus->match_callbacks, m);
2449 } while (bus->match_callbacks_modified);
2454 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2455 _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
2461 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2464 if (bus->manual_peer_interface)
2467 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2470 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2473 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2476 if (streq_ptr(m->member, "Ping"))
2477 r = sd_bus_message_new_method_return(m, &reply);
2478 else if (streq_ptr(m->member, "GetMachineId")) {
2482 r = sd_id128_get_machine(&id);
2486 r = sd_bus_message_new_method_return(m, &reply);
2490 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2492 r = sd_bus_message_new_method_errorf(
2494 SD_BUS_ERROR_UNKNOWN_METHOD,
2495 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2501 r = sd_bus_send(bus, reply, NULL);
2508 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2512 /* If we got a message with a file descriptor which we didn't
2513 * want to accept, then let's drop it. How can this even
2514 * happen? For example, when the kernel queues a message into
2515 * an activatable names's queue which allows fds, and then is
2516 * delivered to us later even though we ourselves did not
2519 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2525 if (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)
2528 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2529 return 1; /* just eat it up */
2531 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2534 static int process_message(sd_bus *bus, sd_bus_message *m) {
2540 bus->current_message = m;
2541 bus->iteration_counter++;
2543 log_debug_bus_message(m);
2545 r = process_hello(bus, m);
2549 r = process_reply(bus, m);
2553 r = process_fd_check(bus, m);
2557 r = process_filter(bus, m);
2561 r = process_match(bus, m);
2565 r = process_builtin(bus, m);
2569 r = bus_process_object(bus, m);
2572 bus->current_message = NULL;
2576 static int dispatch_track(sd_bus *bus) {
2579 if (!bus->track_queue)
2582 bus_track_dispatch(bus->track_queue);
2586 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2587 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2591 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
2593 r = process_timeout(bus);
2597 r = dispatch_wqueue(bus);
2601 r = dispatch_track(bus);
2605 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2611 r = process_message(bus, m);
2616 r = sd_bus_message_rewind(m, true);
2625 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2627 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2628 strna(sd_bus_message_get_sender(m)),
2629 strna(sd_bus_message_get_path(m)),
2630 strna(sd_bus_message_get_interface(m)),
2631 strna(sd_bus_message_get_member(m)));
2633 r = sd_bus_reply_method_errorf(
2635 SD_BUS_ERROR_UNKNOWN_OBJECT,
2636 "Unknown object '%s'.", m->path);
2650 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2651 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2652 struct reply_callback *c;
2656 assert(bus->state == BUS_CLOSING);
2658 c = ordered_hashmap_first(bus->reply_callbacks);
2660 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2663 /* First, fail all outstanding method calls */
2664 r = bus_message_new_synthetic_error(
2667 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2672 r = bus_seal_synthetic_message(bus, m);
2676 if (c->timeout != 0) {
2677 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2681 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2684 slot = container_of(c, sd_bus_slot, reply_callback);
2686 bus->iteration_counter++;
2688 bus->current_message = m;
2689 bus->current_slot = sd_bus_slot_ref(slot);
2690 bus->current_handler = c->callback;
2691 bus->current_userdata = slot->userdata;
2692 r = c->callback(m, slot->userdata, &error_buffer);
2693 bus->current_userdata = NULL;
2694 bus->current_handler = NULL;
2695 bus->current_slot = NULL;
2696 bus->current_message = NULL;
2698 if (slot->floating) {
2699 bus_slot_disconnect(slot);
2700 sd_bus_slot_unref(slot);
2703 sd_bus_slot_unref(slot);
2705 return bus_maybe_reply_error(m, r, &error_buffer);
2708 /* Then, synthesize a Disconnected message */
2709 r = sd_bus_message_new_signal(
2712 "/org/freedesktop/DBus/Local",
2713 "org.freedesktop.DBus.Local",
2718 bus_message_set_sender_local(bus, m);
2720 r = bus_seal_synthetic_message(bus, m);
2726 bus->current_message = m;
2727 bus->iteration_counter++;
2729 r = process_filter(bus, m);
2733 r = process_match(bus, m);
2745 bus->current_message = NULL;
2750 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2751 BUS_DONT_DESTROY(bus);
2754 /* Returns 0 when we didn't do anything. This should cause the
2755 * caller to invoke sd_bus_wait() before returning the next
2756 * time. Returns > 0 when we did something, which possibly
2757 * means *ret is filled in with an unprocessed message. */
2759 assert_return(bus, -EINVAL);
2760 assert_return(!bus_pid_changed(bus), -ECHILD);
2762 /* We don't allow recursively invoking sd_bus_process(). */
2763 assert_return(!bus->current_message, -EBUSY);
2764 assert(!bus->current_slot);
2766 switch (bus->state) {
2775 r = bus_socket_process_opening(bus);
2776 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2777 bus_enter_closing(bus);
2785 case BUS_AUTHENTICATING:
2786 r = bus_socket_process_authenticating(bus);
2787 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2788 bus_enter_closing(bus);
2800 r = process_running(bus, hint_priority, priority, ret);
2801 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2802 bus_enter_closing(bus);
2812 return process_closing(bus, ret);
2815 assert_not_reached("Unknown state");
2818 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2819 return bus_process_internal(bus, false, 0, ret);
2822 /// UNNEEDED by elogind
2824 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2825 return bus_process_internal(bus, true, priority, ret);
2829 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2830 struct pollfd p[2] = {};
2833 usec_t m = USEC_INFINITY;
2837 if (bus->state == BUS_CLOSING)
2840 if (!BUS_IS_OPEN(bus->state))
2843 e = sd_bus_get_events(bus);
2848 /* The caller really needs some more data, he doesn't
2849 * care about what's already read, or any timeouts
2850 * except its own. */
2854 /* The caller wants to process if there's something to
2855 * process, but doesn't care otherwise */
2857 r = sd_bus_get_timeout(bus, &until);
2862 nw = now(CLOCK_MONOTONIC);
2863 m = until > nw ? until - nw : 0;
2867 if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
2870 p[0].fd = bus->input_fd;
2871 if (bus->output_fd == bus->input_fd) {
2875 p[0].events = e & POLLIN;
2876 p[1].fd = bus->output_fd;
2877 p[1].events = e & POLLOUT;
2881 r = ppoll(p, n, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
2885 return r > 0 ? 1 : 0;
2888 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2890 assert_return(bus, -EINVAL);
2891 assert_return(!bus_pid_changed(bus), -ECHILD);
2893 if (bus->state == BUS_CLOSING)
2896 if (!BUS_IS_OPEN(bus->state))
2899 if (bus->rqueue_size > 0)
2902 return bus_poll(bus, false, timeout_usec);
2905 _public_ int sd_bus_flush(sd_bus *bus) {
2908 assert_return(bus, -EINVAL);
2909 assert_return(!bus_pid_changed(bus), -ECHILD);
2911 if (bus->state == BUS_CLOSING)
2914 if (!BUS_IS_OPEN(bus->state))
2917 r = bus_ensure_running(bus);
2921 if (bus->wqueue_size <= 0)
2925 r = dispatch_wqueue(bus);
2927 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2928 bus_enter_closing(bus);
2935 if (bus->wqueue_size <= 0)
2938 r = bus_poll(bus, false, (uint64_t) -1);
2944 _public_ int sd_bus_add_filter(
2947 sd_bus_message_handler_t callback,
2952 assert_return(bus, -EINVAL);
2953 assert_return(callback, -EINVAL);
2954 assert_return(!bus_pid_changed(bus), -ECHILD);
2956 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
2960 s->filter_callback.callback = callback;
2962 bus->filter_callbacks_modified = true;
2963 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
2971 _public_ int sd_bus_add_match(
2975 sd_bus_message_handler_t callback,
2978 struct bus_match_component *components = NULL;
2979 unsigned n_components = 0;
2980 sd_bus_slot *s = NULL;
2983 assert_return(bus, -EINVAL);
2984 assert_return(match, -EINVAL);
2985 assert_return(!bus_pid_changed(bus), -ECHILD);
2987 r = bus_match_parse(match, &components, &n_components);
2991 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
2997 s->match_callback.callback = callback;
2998 s->match_callback.cookie = ++bus->match_cookie;
3000 if (bus->bus_client) {
3001 enum bus_match_scope scope;
3003 scope = bus_match_get_scope(components, n_components);
3005 /* Do not install server-side matches for matches
3006 * against the local service, interface or bus
3008 if (scope != BUS_MATCH_LOCAL) {
3010 if (!bus->is_kernel) {
3011 /* When this is not a kernel transport, we
3012 * store the original match string, so that we
3013 * can use it to remove the match again */
3015 s->match_callback.match_string = strdup(match);
3016 if (!s->match_callback.match_string) {
3022 r = bus_add_match_internal(bus, s->match_callback.match_string, components, n_components, s->match_callback.cookie);
3026 s->match_added = true;
3030 bus->match_callbacks_modified = true;
3031 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3040 bus_match_parse_free(components, n_components);
3041 sd_bus_slot_unref(s);
3046 /// UNNEEDED by elogind
3048 int bus_remove_match_by_string(
3051 sd_bus_message_handler_t callback,
3054 struct bus_match_component *components = NULL;
3055 unsigned n_components = 0;
3056 struct match_callback *c;
3059 assert_return(bus, -EINVAL);
3060 assert_return(match, -EINVAL);
3061 assert_return(!bus_pid_changed(bus), -ECHILD);
3063 r = bus_match_parse(match, &components, &n_components);
3067 r = bus_match_find(&bus->match_callbacks, components, n_components, NULL, NULL, &c);
3071 sd_bus_slot_unref(container_of(c, sd_bus_slot, match_callback));
3074 bus_match_parse_free(components, n_components);
3080 bool bus_pid_changed(sd_bus *bus) {
3083 /* We don't support people creating a bus connection and
3084 * keeping it around over a fork(). Let's complain. */
3086 return bus->original_pid != getpid();
3089 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3090 sd_bus *bus = userdata;
3095 r = sd_bus_process(bus, NULL);
3102 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3103 sd_bus *bus = userdata;
3108 r = sd_bus_process(bus, NULL);
3115 static int prepare_callback(sd_event_source *s, void *userdata) {
3116 sd_bus *bus = userdata;
3123 e = sd_bus_get_events(bus);
3127 if (bus->output_fd != bus->input_fd) {
3129 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3133 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3137 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3142 r = sd_bus_get_timeout(bus, &until);
3148 j = sd_event_source_set_time(bus->time_event_source, until);
3153 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3160 static int quit_callback(sd_event_source *event, void *userdata) {
3161 sd_bus *bus = userdata;
3171 static int attach_io_events(sd_bus *bus) {
3176 if (bus->input_fd < 0)
3182 if (!bus->input_io_event_source) {
3183 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3187 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3191 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3195 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3197 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3202 if (bus->output_fd != bus->input_fd) {
3203 assert(bus->output_fd >= 0);
3205 if (!bus->output_io_event_source) {
3206 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3210 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3214 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3216 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3225 static void detach_io_events(sd_bus *bus) {
3228 if (bus->input_io_event_source) {
3229 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3230 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3233 if (bus->output_io_event_source) {
3234 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3235 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3239 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3242 assert_return(bus, -EINVAL);
3243 assert_return(!bus->event, -EBUSY);
3245 assert(!bus->input_io_event_source);
3246 assert(!bus->output_io_event_source);
3247 assert(!bus->time_event_source);
3250 bus->event = sd_event_ref(event);
3252 r = sd_event_default(&bus->event);
3257 bus->event_priority = priority;
3259 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3263 r = sd_event_source_set_priority(bus->time_event_source, priority);
3267 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3271 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3275 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3279 r = attach_io_events(bus);
3286 sd_bus_detach_event(bus);
3290 _public_ int sd_bus_detach_event(sd_bus *bus) {
3291 assert_return(bus, -EINVAL);
3296 detach_io_events(bus);
3298 if (bus->time_event_source) {
3299 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3300 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3303 if (bus->quit_event_source) {
3304 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3305 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3308 bus->event = sd_event_unref(bus->event);
3312 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3313 assert_return(bus, NULL);
3318 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3319 assert_return(bus, NULL);
3321 return bus->current_message;
3324 /// UNNEEDED by elogind
3326 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3327 assert_return(bus, NULL);
3329 return bus->current_slot;
3333 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3334 assert_return(bus, NULL);
3336 return bus->current_handler;
3339 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3340 assert_return(bus, NULL);
3342 return bus->current_userdata;
3345 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3350 assert(default_bus);
3353 return !!*default_bus;
3356 *ret = sd_bus_ref(*default_bus);
3364 b->default_bus_ptr = default_bus;
3372 _public_ int sd_bus_default_system(sd_bus **ret) {
3373 static thread_local sd_bus *default_system_bus = NULL;
3375 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3378 _public_ int sd_bus_default_user(sd_bus **ret) {
3379 static thread_local sd_bus *default_user_bus = NULL;
3381 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3384 _public_ int sd_bus_default(sd_bus **ret) {
3388 /* Let's try our best to reuse another cached connection. If
3389 * the starter bus type is set, connect via our normal
3390 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3391 * we can share the connection with the user/system default
3394 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3396 if (streq(e, "system"))
3397 return sd_bus_default_system(ret);
3398 else if (STR_IN_SET(e, "user", "session"))
3399 return sd_bus_default_user(ret);
3402 /* No type is specified, so we have not other option than to
3403 * use the starter address if it is set. */
3405 e = secure_getenv("DBUS_STARTER_ADDRESS");
3407 static thread_local sd_bus *default_starter_bus = NULL;
3409 return bus_default(sd_bus_open, &default_starter_bus, ret);
3412 /* Finally, if nothing is set use the cached connection for
3413 * the right scope */
3415 if (cg_pid_get_owner_uid(0, NULL) >= 0)
3416 return sd_bus_default_user(ret);
3418 return sd_bus_default_system(ret);
3421 /// UNNEEDED by elogind
3423 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3424 assert_return(b, -EINVAL);
3425 assert_return(tid, -EINVAL);
3426 assert_return(!bus_pid_changed(b), -ECHILD);
3434 return sd_event_get_tid(b->event, tid);
3439 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3440 _cleanup_free_ char *e = NULL;
3443 assert_return(object_path_is_valid(prefix), -EINVAL);
3444 assert_return(external_id, -EINVAL);
3445 assert_return(ret_path, -EINVAL);
3447 e = bus_label_escape(external_id);
3451 ret = strjoin(prefix, "/", e, NULL);
3459 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3463 assert_return(object_path_is_valid(path), -EINVAL);
3464 assert_return(object_path_is_valid(prefix), -EINVAL);
3465 assert_return(external_id, -EINVAL);
3467 e = object_path_startswith(path, prefix);
3469 *external_id = NULL;
3473 ret = bus_label_unescape(e);
3482 _public_ int sd_bus_try_close(sd_bus *bus) {
3485 assert_return(bus, -EINVAL);
3486 assert_return(!bus_pid_changed(bus), -ECHILD);
3488 if (!bus->is_kernel)
3491 if (!BUS_IS_OPEN(bus->state))
3494 if (bus->rqueue_size > 0)
3497 if (bus->wqueue_size > 0)
3500 r = bus_kernel_try_close(bus);
3508 /// UNNEEDED by elogind
3510 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3511 assert_return(bus, -EINVAL);
3512 assert_return(description, -EINVAL);
3513 assert_return(bus->description, -ENXIO);
3514 assert_return(!bus_pid_changed(bus), -ECHILD);
3516 *description = bus->description;
3521 int bus_get_root_path(sd_bus *bus) {
3524 if (bus->cgroup_root)
3527 r = cg_get_root_path(&bus->cgroup_root);
3529 bus->cgroup_root = strdup("/");
3530 if (!bus->cgroup_root)
3539 /// UNNEEDED by elogind
3541 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3544 assert_return(bus, -EINVAL);
3545 assert_return(scope, -EINVAL);
3546 assert_return(!bus_pid_changed(bus), -ECHILD);
3548 if (bus->is_kernel) {
3549 _cleanup_free_ char *n = NULL;
3552 r = bus_kernel_get_bus_name(bus, &n);
3556 if (streq(n, "0-system")) {
3561 dash = strchr(n, '-');
3562 if (streq_ptr(dash, "-user")) {
3573 if (bus->is_system) {
3581 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3583 assert_return(bus, -EINVAL);
3584 assert_return(address, -EINVAL);
3585 assert_return(!bus_pid_changed(bus), -ECHILD);
3588 *address = bus->address;
3595 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
3596 assert_return(bus, -EINVAL);
3597 assert_return(mask, -EINVAL);
3598 assert_return(!bus_pid_changed(bus), -ECHILD);
3600 *mask = bus->creds_mask;
3604 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
3605 assert_return(bus, -EINVAL);
3606 assert_return(!bus_pid_changed(bus), -ECHILD);
3608 return bus->bus_client;
3611 _public_ int sd_bus_is_server(sd_bus *bus) {
3612 assert_return(bus, -EINVAL);
3613 assert_return(!bus_pid_changed(bus), -ECHILD);
3615 return bus->is_server;
3618 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
3619 assert_return(bus, -EINVAL);
3620 assert_return(!bus_pid_changed(bus), -ECHILD);
3622 return bus->anonymous_auth;
3625 _public_ int sd_bus_is_trusted(sd_bus *bus) {
3626 assert_return(bus, -EINVAL);
3627 assert_return(!bus_pid_changed(bus), -ECHILD);
3629 return bus->trusted;
3632 _public_ int sd_bus_is_monitor(sd_bus *bus) {
3633 assert_return(bus, -EINVAL);
3634 assert_return(!bus_pid_changed(bus), -ECHILD);
3636 return !!(bus->hello_flags & KDBUS_HELLO_MONITOR);