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 "bus-label.h"
39 #include "bus-internal.h"
40 #include "bus-message.h"
42 #include "bus-socket.h"
43 #include "bus-kernel.h"
44 #include "bus-control.h"
45 #include "bus-objects.h"
47 #include "bus-container.h"
48 #include "bus-protocol.h"
49 #include "bus-track.h"
52 #define log_debug_bus_message(m) \
54 sd_bus_message *_mm = (m); \
55 log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s", \
56 bus_message_type_to_string(_mm->header->type), \
57 strna(sd_bus_message_get_sender(_mm)), \
58 strna(sd_bus_message_get_destination(_mm)), \
59 strna(sd_bus_message_get_path(_mm)), \
60 strna(sd_bus_message_get_interface(_mm)), \
61 strna(sd_bus_message_get_member(_mm)), \
62 BUS_MESSAGE_COOKIE(_mm), \
64 strna(_mm->error.message)); \
67 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
68 static int attach_io_events(sd_bus *b);
69 static void detach_io_events(sd_bus *b);
71 static void bus_close_fds(sd_bus *b) {
76 if (b->input_fd != b->output_fd)
77 safe_close(b->output_fd);
78 b->output_fd = b->input_fd = safe_close(b->input_fd);
81 static void bus_reset_queues(sd_bus *b) {
84 while (b->rqueue_size > 0)
85 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
87 b->rqueue = mfree(b->rqueue);
88 b->rqueue_allocated = 0;
90 while (b->wqueue_size > 0)
91 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
93 b->wqueue = mfree(b->wqueue);
94 b->wqueue_allocated = 0;
97 static void bus_free(sd_bus *b) {
101 assert(!b->track_queue);
103 b->state = BUS_CLOSED;
105 sd_bus_detach_event(b);
107 while ((s = b->slots)) {
108 /* At this point only floating slots can still be
109 * around, because the non-floating ones keep a
110 * reference to the bus, and we thus couldn't be
111 * destructing right now... We forcibly disconnect the
112 * slots here, so that they still can be referenced by
113 * apps, but are dead. */
116 bus_slot_disconnect(s);
117 sd_bus_slot_unref(s);
120 if (b->default_bus_ptr)
121 *b->default_bus_ptr = NULL;
126 munmap(b->kdbus_buffer, KDBUS_POOL_SIZE);
130 free(b->unique_name);
131 free(b->auth_buffer);
136 free(b->cgroup_root);
137 free(b->description);
140 strv_free(b->exec_argv);
142 close_many(b->fds, b->n_fds);
147 ordered_hashmap_free_free(b->reply_callbacks);
148 prioq_free(b->reply_callbacks_prioq);
150 assert(b->match_callbacks.type == BUS_MATCH_ROOT);
151 bus_match_free(&b->match_callbacks);
153 hashmap_free_free(b->vtable_methods);
154 hashmap_free_free(b->vtable_properties);
156 assert(hashmap_isempty(b->nodes));
157 hashmap_free(b->nodes);
159 bus_kernel_flush_memfd(b);
161 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
166 _public_ int sd_bus_new(sd_bus **ret) {
169 assert_return(ret, -EINVAL);
175 r->n_ref = REFCNT_INIT;
176 r->input_fd = r->output_fd = -1;
177 r->message_version = 1;
178 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
179 r->hello_flags |= KDBUS_HELLO_ACCEPT_FD;
180 r->attach_flags |= KDBUS_ATTACH_NAMES;
181 r->original_pid = getpid();
183 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
185 /* We guarantee that wqueue always has space for at least one
187 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
196 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
199 assert_return(bus, -EINVAL);
200 assert_return(bus->state == BUS_UNSET, -EPERM);
201 assert_return(address, -EINVAL);
202 assert_return(!bus_pid_changed(bus), -ECHILD);
214 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
215 assert_return(bus, -EINVAL);
216 assert_return(bus->state == BUS_UNSET, -EPERM);
217 assert_return(input_fd >= 0, -EINVAL);
218 assert_return(output_fd >= 0, -EINVAL);
219 assert_return(!bus_pid_changed(bus), -ECHILD);
221 bus->input_fd = input_fd;
222 bus->output_fd = output_fd;
226 /// UNNEEDED by elogind
228 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
231 assert_return(bus, -EINVAL);
232 assert_return(bus->state == BUS_UNSET, -EPERM);
233 assert_return(path, -EINVAL);
234 assert_return(!strv_isempty(argv), -EINVAL);
235 assert_return(!bus_pid_changed(bus), -ECHILD);
247 free(bus->exec_path);
248 strv_free(bus->exec_argv);
256 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
257 assert_return(bus, -EINVAL);
258 assert_return(bus->state == BUS_UNSET, -EPERM);
259 assert_return(!bus_pid_changed(bus), -ECHILD);
261 bus->bus_client = !!b;
265 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
266 assert_return(bus, -EINVAL);
267 assert_return(bus->state == BUS_UNSET, -EPERM);
268 assert_return(!bus_pid_changed(bus), -ECHILD);
270 SET_FLAG(bus->hello_flags, KDBUS_HELLO_MONITOR, b);
274 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
275 assert_return(bus, -EINVAL);
276 assert_return(bus->state == BUS_UNSET, -EPERM);
277 assert_return(!bus_pid_changed(bus), -ECHILD);
279 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ACCEPT_FD, b);
283 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
285 assert_return(bus, -EINVAL);
286 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
287 assert_return(!bus_pid_changed(bus), -ECHILD);
289 new_flags = bus->attach_flags;
290 SET_FLAG(new_flags, KDBUS_ATTACH_TIMESTAMP, b);
292 if (bus->attach_flags == new_flags)
295 bus->attach_flags = new_flags;
296 if (bus->state != BUS_UNSET && bus->is_kernel)
297 bus_kernel_realize_attach_flags(bus);
303 _public_ int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t mask) {
306 assert_return(bus, -EINVAL);
307 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
308 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
309 assert_return(!bus_pid_changed(bus), -ECHILD);
312 bus->creds_mask |= mask;
314 bus->creds_mask &= ~mask;
316 /* The well knowns we need unconditionally, so that matches can work */
317 bus->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
319 /* Make sure we don't lose the timestamp flag */
320 new_flags = (bus->attach_flags & KDBUS_ATTACH_TIMESTAMP) | attach_flags_to_kdbus(bus->creds_mask);
321 if (bus->attach_flags == new_flags)
324 bus->attach_flags = new_flags;
325 if (bus->state != BUS_UNSET && bus->is_kernel)
326 bus_kernel_realize_attach_flags(bus);
331 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
332 assert_return(bus, -EINVAL);
333 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
334 assert_return(bus->state == BUS_UNSET, -EPERM);
335 assert_return(!bus_pid_changed(bus), -ECHILD);
337 bus->is_server = !!b;
338 bus->server_id = server_id;
342 /// UNNEEDED by elogind
344 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
345 assert_return(bus, -EINVAL);
346 assert_return(bus->state == BUS_UNSET, -EPERM);
347 assert_return(!bus_pid_changed(bus), -ECHILD);
349 bus->anonymous_auth = !!b;
353 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
354 assert_return(bus, -EINVAL);
355 assert_return(bus->state == BUS_UNSET, -EPERM);
356 assert_return(!bus_pid_changed(bus), -ECHILD);
362 _public_ int sd_bus_set_description(sd_bus *bus, const char *description) {
363 assert_return(bus, -EINVAL);
364 assert_return(bus->state == BUS_UNSET, -EPERM);
365 assert_return(!bus_pid_changed(bus), -ECHILD);
367 return free_and_strdup(&bus->description, description);
371 _public_ int sd_bus_set_allow_interactive_authorization(sd_bus *bus, int b) {
372 assert_return(bus, -EINVAL);
373 assert_return(!bus_pid_changed(bus), -ECHILD);
375 bus->allow_interactive_authorization = !!b;
379 /// UNNEEDED by elogind
381 _public_ int sd_bus_get_allow_interactive_authorization(sd_bus *bus) {
382 assert_return(bus, -EINVAL);
383 assert_return(!bus_pid_changed(bus), -ECHILD);
385 return bus->allow_interactive_authorization;
389 static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) {
397 assert(bus->state == BUS_HELLO || bus->state == BUS_CLOSING);
399 r = sd_bus_message_get_errno(reply);
403 r = sd_bus_message_read(reply, "s", &s);
407 if (!service_name_is_valid(s) || s[0] != ':')
410 bus->unique_name = strdup(s);
411 if (!bus->unique_name)
414 if (bus->state == BUS_HELLO)
415 bus->state = BUS_RUNNING;
420 static int bus_send_hello(sd_bus *bus) {
421 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
426 if (!bus->bus_client || bus->is_kernel)
429 r = sd_bus_message_new_method_call(
432 "org.freedesktop.DBus",
433 "/org/freedesktop/DBus",
434 "org.freedesktop.DBus",
439 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
442 int bus_start_running(sd_bus *bus) {
445 if (bus->bus_client && !bus->is_kernel) {
446 bus->state = BUS_HELLO;
450 bus->state = BUS_RUNNING;
454 static int parse_address_key(const char **p, const char *key, char **value) {
455 size_t l, n = 0, allocated = 0;
465 if (strncmp(*p, key, l) != 0)
478 while (*a != ';' && *a != ',' && *a != 0) {
496 c = (char) ((x << 4) | y);
503 if (!GREEDY_REALLOC(r, allocated, n + 2))
527 static void skip_address_key(const char **p) {
531 *p += strcspn(*p, ",");
537 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
538 _cleanup_free_ char *path = NULL, *abstract = NULL;
547 while (**p != 0 && **p != ';') {
548 r = parse_address_key(p, "guid", guid);
554 r = parse_address_key(p, "path", &path);
560 r = parse_address_key(p, "abstract", &abstract);
569 if (!path && !abstract)
572 if (path && abstract)
577 if (l > sizeof(b->sockaddr.un.sun_path))
580 b->sockaddr.un.sun_family = AF_UNIX;
581 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
582 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
583 } else if (abstract) {
584 l = strlen(abstract);
585 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
588 b->sockaddr.un.sun_family = AF_UNIX;
589 b->sockaddr.un.sun_path[0] = 0;
590 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
591 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
597 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
598 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
600 struct addrinfo *result, hints = {
601 .ai_socktype = SOCK_STREAM,
602 .ai_flags = AI_ADDRCONFIG,
610 while (**p != 0 && **p != ';') {
611 r = parse_address_key(p, "guid", guid);
617 r = parse_address_key(p, "host", &host);
623 r = parse_address_key(p, "port", &port);
629 r = parse_address_key(p, "family", &family);
642 if (streq(family, "ipv4"))
643 hints.ai_family = AF_INET;
644 else if (streq(family, "ipv6"))
645 hints.ai_family = AF_INET6;
650 r = getaddrinfo(host, port, &hints, &result);
654 return -EADDRNOTAVAIL;
656 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
657 b->sockaddr_size = result->ai_addrlen;
659 freeaddrinfo(result);
664 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
666 unsigned n_argv = 0, j;
668 size_t allocated = 0;
676 while (**p != 0 && **p != ';') {
677 r = parse_address_key(p, "guid", guid);
683 r = parse_address_key(p, "path", &path);
689 if (startswith(*p, "argv")) {
693 ul = strtoul(*p + 4, (char**) p, 10);
694 if (errno > 0 || **p != '=' || ul > 256) {
702 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
710 r = parse_address_key(p, NULL, argv + ul);
725 /* Make sure there are no holes in the array, with the
726 * exception of argv[0] */
727 for (j = 1; j < n_argv; j++)
733 if (argv && argv[0] == NULL) {
734 argv[0] = strdup(path);
746 for (j = 0; j < n_argv; j++)
754 static int parse_kernel_address(sd_bus *b, const char **p, char **guid) {
755 _cleanup_free_ char *path = NULL;
763 while (**p != 0 && **p != ';') {
764 r = parse_address_key(p, "guid", guid);
770 r = parse_address_key(p, "path", &path);
789 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
790 _cleanup_free_ char *machine = NULL, *pid = NULL;
798 while (**p != 0 && **p != ';') {
799 r = parse_address_key(p, "guid", guid);
805 r = parse_address_key(p, "machine", &machine);
811 r = parse_address_key(p, "pid", &pid);
820 if (!machine == !pid)
824 if (!machine_name_is_valid(machine))
828 b->machine = machine;
836 r = parse_pid(pid, &b->nspid);
842 b->sockaddr.un.sun_family = AF_UNIX;
843 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
844 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + strlen("/var/run/dbus/system_bus_socket");
849 static int parse_container_kernel_address(sd_bus *b, const char **p, char **guid) {
850 _cleanup_free_ char *machine = NULL, *pid = NULL;
858 while (**p != 0 && **p != ';') {
859 r = parse_address_key(p, "guid", guid);
865 r = parse_address_key(p, "machine", &machine);
871 r = parse_address_key(p, "pid", &pid);
880 if (!machine == !pid)
884 if (!machine_name_is_valid(machine))
888 b->machine = machine;
896 r = parse_pid(pid, &b->nspid);
903 b->kernel = strdup("/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) {
1019 bool skipped = false;
1024 r = bus_socket_exec(b);
1026 else if ((b->nspid > 0 || b->machine) && b->kernel)
1027 r = bus_container_connect_kernel(b);
1028 else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC)
1029 r = bus_container_connect_socket(b);
1032 r = bus_kernel_connect(b);
1033 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
1034 r = bus_socket_connect(b);
1040 r = attach_io_events(b);
1045 b->last_connect_error = -r;
1048 r = bus_parse_next_address(b);
1052 return b->last_connect_error ? -b->last_connect_error : -ECONNREFUSED;
1056 int bus_next_address(sd_bus *b) {
1059 bus_reset_parsed_address(b);
1060 return bus_start_address(b);
1063 static int bus_start_fd(sd_bus *b) {
1068 assert(b->input_fd >= 0);
1069 assert(b->output_fd >= 0);
1071 r = fd_nonblock(b->input_fd, true);
1075 r = fd_cloexec(b->input_fd, true);
1079 if (b->input_fd != b->output_fd) {
1080 r = fd_nonblock(b->output_fd, true);
1084 r = fd_cloexec(b->output_fd, true);
1089 if (fstat(b->input_fd, &st) < 0)
1092 if (S_ISCHR(b->input_fd))
1093 return bus_kernel_take_fd(b);
1095 return bus_socket_take_fd(b);
1098 _public_ int sd_bus_start(sd_bus *bus) {
1101 assert_return(bus, -EINVAL);
1102 assert_return(bus->state == BUS_UNSET, -EPERM);
1103 assert_return(!bus_pid_changed(bus), -ECHILD);
1105 bus->state = BUS_OPENING;
1107 if (bus->is_server && bus->bus_client)
1110 if (bus->input_fd >= 0)
1111 r = bus_start_fd(bus);
1112 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->kernel || bus->machine)
1113 r = bus_start_address(bus);
1122 return bus_send_hello(bus);
1125 _public_ int sd_bus_open(sd_bus **ret) {
1130 assert_return(ret, -EINVAL);
1132 /* Let's connect to the starter bus if it is set, and
1133 * otherwise to the bus that is appropropriate for the scope
1134 * we are running in */
1136 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1138 if (streq(e, "system"))
1139 return sd_bus_open_system(ret);
1140 else if (STR_IN_SET(e, "session", "user"))
1141 return sd_bus_open_user(ret);
1144 e = secure_getenv("DBUS_STARTER_ADDRESS");
1146 return sd_bus_open_system(ret);
1153 r = sd_bus_set_address(b, e);
1157 b->bus_client = true;
1159 /* We don't know whether the bus is trusted or not, so better
1160 * be safe, and authenticate everything */
1162 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1163 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1165 r = sd_bus_start(b);
1177 int bus_set_address_system(sd_bus *b) {
1181 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1183 return sd_bus_set_address(b, e);
1185 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1188 _public_ int sd_bus_open_system(sd_bus **ret) {
1192 assert_return(ret, -EINVAL);
1198 r = bus_set_address_system(b);
1202 b->bus_client = true;
1203 b->is_system = true;
1205 /* Let's do per-method access control on the system bus. We
1206 * need the caller's UID and capability set for that. */
1208 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1209 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1211 r = sd_bus_start(b);
1223 int bus_set_address_user(sd_bus *b) {
1228 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1230 return sd_bus_set_address(b, e);
1232 e = secure_getenv("XDG_RUNTIME_DIR");
1234 _cleanup_free_ char *ee = NULL;
1236 ee = bus_address_escape(e);
1240 (void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT ";" UNIX_USER_BUS_ADDRESS_FMT, getuid(), ee);
1242 (void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT, getuid());
1250 _public_ int sd_bus_open_user(sd_bus **ret) {
1254 assert_return(ret, -EINVAL);
1260 r = bus_set_address_user(b);
1264 b->bus_client = true;
1267 /* We don't do any per-method access control on the user
1271 r = sd_bus_start(b);
1283 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1284 _cleanup_free_ char *e = NULL;
1285 char *m = NULL, *c = NULL;
1290 /* Let's see if we shall enter some container */
1291 m = strchr(host, ':');
1295 /* Let's make sure this is not a port of some kind,
1296 * and is a valid machine name. */
1297 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1300 /* Cut out the host part */
1301 t = strndupa(host, m - host - 1);
1302 e = bus_address_escape(t);
1306 c = strjoina(",argv4=--machine=", m);
1311 e = bus_address_escape(host);
1316 b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e, ",argv3=systemd-stdio-bridge", c, NULL);
1323 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1327 assert_return(host, -EINVAL);
1328 assert_return(ret, -EINVAL);
1330 r = sd_bus_new(&bus);
1334 r = bus_set_address_system_remote(bus, host);
1338 bus->bus_client = true;
1339 bus->trusted = false;
1340 bus->is_system = true;
1342 r = sd_bus_start(bus);
1354 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1355 _cleanup_free_ char *e = NULL;
1360 e = bus_address_escape(machine);
1364 b->address = strjoin("x-machine-kernel:machine=", e, ";x-machine-unix:machine=", e, NULL);
1371 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1375 assert_return(machine, -EINVAL);
1376 assert_return(ret, -EINVAL);
1377 assert_return(machine_name_is_valid(machine), -EINVAL);
1379 r = sd_bus_new(&bus);
1383 r = bus_set_address_system_machine(bus, machine);
1387 bus->bus_client = true;
1388 bus->trusted = false;
1389 bus->is_system = true;
1391 r = sd_bus_start(bus);
1403 _public_ void sd_bus_close(sd_bus *bus) {
1407 if (bus->state == BUS_CLOSED)
1409 if (bus_pid_changed(bus))
1412 bus->state = BUS_CLOSED;
1414 sd_bus_detach_event(bus);
1416 /* Drop all queued messages so that they drop references to
1417 * the bus object and the bus may be freed */
1418 bus_reset_queues(bus);
1420 if (!bus->is_kernel)
1423 /* We'll leave the fd open in case this is a kernel bus, since
1424 * there might still be memblocks around that reference this
1425 * bus, and they might need to invoke the KDBUS_CMD_FREE
1426 * ioctl on the fd when they are freed. */
1429 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1437 return sd_bus_unref(bus);
1440 static void bus_enter_closing(sd_bus *bus) {
1443 if (bus->state != BUS_OPENING &&
1444 bus->state != BUS_AUTHENTICATING &&
1445 bus->state != BUS_HELLO &&
1446 bus->state != BUS_RUNNING)
1449 bus->state = BUS_CLOSING;
1452 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1453 assert_return(bus, NULL);
1455 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1460 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1466 i = REFCNT_DEC(bus->n_ref);
1474 /// UNNEEDED by elogind
1476 _public_ int sd_bus_is_open(sd_bus *bus) {
1478 assert_return(bus, -EINVAL);
1479 assert_return(!bus_pid_changed(bus), -ECHILD);
1481 return BUS_IS_OPEN(bus->state);
1485 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1488 assert_return(bus, -EINVAL);
1489 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1490 assert_return(!bus_pid_changed(bus), -ECHILD);
1492 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
1495 if (type == SD_BUS_TYPE_UNIX_FD) {
1496 if (!(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD))
1499 r = bus_ensure_running(bus);
1503 return bus->can_fds;
1506 return bus_type_is_valid(type);
1509 /// UNNEEDED by elogind
1511 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1514 assert_return(bus, -EINVAL);
1515 assert_return(id, -EINVAL);
1516 assert_return(!bus_pid_changed(bus), -ECHILD);
1518 r = bus_ensure_running(bus);
1522 *id = bus->server_id;
1527 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1532 /* If we copy the same message to multiple
1533 * destinations, avoid using the same cookie
1535 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1540 timeout = BUS_DEFAULT_TIMEOUT;
1542 return bus_message_seal(m, ++b->cookie, timeout);
1545 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1546 bool remarshal = false;
1550 /* wrong packet version */
1551 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1554 /* wrong packet endianness */
1555 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1558 /* TODO: kdbus-messages received from the kernel contain data which is
1559 * not allowed to be passed to KDBUS_CMD_SEND. Therefore, we have to
1560 * force remarshaling of the message. Technically, we could just
1561 * recreate the kdbus message, but that is non-trivial as other parts of
1562 * the message refer to m->kdbus already. This should be fixed! */
1563 if ((*m)->kdbus && (*m)->release_kdbus)
1566 return remarshal ? bus_message_remarshal(b, m) : 0;
1569 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1573 /* Fake some timestamps, if they were requested, and not
1574 * already initialized */
1575 if (b->attach_flags & KDBUS_ATTACH_TIMESTAMP) {
1576 if (m->realtime <= 0)
1577 m->realtime = now(CLOCK_REALTIME);
1579 if (m->monotonic <= 0)
1580 m->monotonic = now(CLOCK_MONOTONIC);
1583 /* The bus specification says the serial number cannot be 0,
1584 * hence let's fill something in for synthetic messages. Since
1585 * synthetic messages might have a fake sender and we don't
1586 * want to interfere with the real sender's serial numbers we
1587 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1588 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1589 * even though kdbus can do 64bit. */
1590 return bus_message_seal(m, 0xFFFFFFFFULL, 0);
1593 static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
1600 r = bus_kernel_write_message(bus, m, hint_sync_call);
1602 r = bus_socket_write_message(bus, m, idx);
1607 if (bus->is_kernel || *idx >= BUS_MESSAGE_SIZE(m))
1608 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
1609 bus_message_type_to_string(m->header->type),
1610 strna(sd_bus_message_get_sender(m)),
1611 strna(sd_bus_message_get_destination(m)),
1612 strna(sd_bus_message_get_path(m)),
1613 strna(sd_bus_message_get_interface(m)),
1614 strna(sd_bus_message_get_member(m)),
1615 BUS_MESSAGE_COOKIE(m),
1617 strna(m->error.message));
1622 static int dispatch_wqueue(sd_bus *bus) {
1626 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1628 while (bus->wqueue_size > 0) {
1630 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
1634 /* Didn't do anything this time */
1636 else if (bus->is_kernel || bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1637 /* Fully written. Let's drop the entry from
1640 * This isn't particularly optimized, but
1641 * well, this is supposed to be our worst-case
1642 * buffer only, and the socket buffer is
1643 * supposed to be our primary buffer, and if
1644 * it got full, then all bets are off
1647 bus->wqueue_size --;
1648 sd_bus_message_unref(bus->wqueue[0]);
1649 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1659 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1663 return bus_kernel_read_message(bus, hint_priority, priority);
1665 return bus_socket_read_message(bus);
1668 int bus_rqueue_make_room(sd_bus *bus) {
1671 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1674 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1680 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1685 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1687 /* Note that the priority logic is only available on kdbus,
1688 * where the rqueue is unused. We check the rqueue here
1689 * anyway, because it's simple... */
1692 if (bus->rqueue_size > 0) {
1693 /* Dispatch a queued message */
1695 *m = bus->rqueue[0];
1696 bus->rqueue_size --;
1697 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1701 /* Try to read a new message */
1702 r = bus_read_message(bus, hint_priority, priority);
1712 static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
1713 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1716 assert_return(m, -EINVAL);
1721 assert_return(!bus_pid_changed(bus), -ECHILD);
1722 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1724 if (!BUS_IS_OPEN(bus->state))
1728 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1735 /* If the cookie number isn't kept, then we know that no reply
1737 if (!cookie && !m->sealed)
1738 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1740 r = bus_seal_message(bus, m, 0);
1744 /* Remarshall if we have to. This will possibly unref the
1745 * message and place a replacement in m */
1746 r = bus_remarshal_message(bus, &m);
1750 /* If this is a reply and no reply was requested, then let's
1751 * suppress this, if we can */
1755 if ((bus->state == BUS_RUNNING || bus->state == BUS_HELLO) && bus->wqueue_size <= 0) {
1758 r = bus_write_message(bus, m, hint_sync_call, &idx);
1760 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1761 bus_enter_closing(bus);
1768 if (!bus->is_kernel && idx < BUS_MESSAGE_SIZE(m)) {
1769 /* Wasn't fully written. So let's remember how
1770 * much was written. Note that the first entry
1771 * of the wqueue array is always allocated so
1772 * that we always can remember how much was
1774 bus->wqueue[0] = sd_bus_message_ref(m);
1775 bus->wqueue_size = 1;
1780 /* Just append it to the queue. */
1782 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1785 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1788 bus->wqueue[bus->wqueue_size ++] = sd_bus_message_ref(m);
1793 *cookie = BUS_MESSAGE_COOKIE(m);
1798 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1799 return bus_send_internal(bus, m, cookie, false);
1802 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1805 assert_return(m, -EINVAL);
1810 assert_return(!bus_pid_changed(bus), -ECHILD);
1812 if (!BUS_IS_OPEN(bus->state))
1815 if (!streq_ptr(m->destination, destination)) {
1820 r = sd_bus_message_set_destination(m, destination);
1825 return sd_bus_send(bus, m, cookie);
1828 static usec_t calc_elapse(uint64_t usec) {
1829 if (usec == (uint64_t) -1)
1832 return now(CLOCK_MONOTONIC) + usec;
1835 static int timeout_compare(const void *a, const void *b) {
1836 const struct reply_callback *x = a, *y = b;
1838 if (x->timeout != 0 && y->timeout == 0)
1841 if (x->timeout == 0 && y->timeout != 0)
1844 if (x->timeout < y->timeout)
1847 if (x->timeout > y->timeout)
1853 _public_ int sd_bus_call_async(
1857 sd_bus_message_handler_t callback,
1861 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1862 _cleanup_bus_slot_unref_ sd_bus_slot *s = NULL;
1865 assert_return(m, -EINVAL);
1866 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1867 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1868 assert_return(callback, -EINVAL);
1873 assert_return(!bus_pid_changed(bus), -ECHILD);
1874 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1876 if (!BUS_IS_OPEN(bus->state))
1879 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
1883 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1887 r = bus_seal_message(bus, m, usec);
1891 r = bus_remarshal_message(bus, &m);
1895 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
1899 s->reply_callback.callback = callback;
1901 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
1902 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
1904 s->reply_callback.cookie = 0;
1908 s->reply_callback.timeout = calc_elapse(m->timeout);
1909 if (s->reply_callback.timeout != 0) {
1910 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
1912 s->reply_callback.timeout = 0;
1917 r = sd_bus_send(bus, m, &s->reply_callback.cookie);
1928 int bus_ensure_running(sd_bus *bus) {
1933 if (bus->state == BUS_UNSET || bus->state == BUS_CLOSED || bus->state == BUS_CLOSING)
1935 if (bus->state == BUS_RUNNING)
1939 r = sd_bus_process(bus, NULL);
1942 if (bus->state == BUS_RUNNING)
1947 r = sd_bus_wait(bus, (uint64_t) -1);
1953 _public_ int sd_bus_call(
1957 sd_bus_error *error,
1958 sd_bus_message **reply) {
1960 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1966 assert_return(m, -EINVAL);
1967 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1968 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1969 assert_return(!bus_error_is_dirty(error), -EINVAL);
1974 assert_return(!bus_pid_changed(bus), -ECHILD);
1975 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1977 if (!BUS_IS_OPEN(bus->state))
1980 r = bus_ensure_running(bus);
1984 i = bus->rqueue_size;
1986 r = bus_seal_message(bus, m, usec);
1990 r = bus_remarshal_message(bus, &m);
1994 r = bus_send_internal(bus, m, &cookie, true);
1998 timeout = calc_elapse(m->timeout);
2003 while (i < bus->rqueue_size) {
2004 sd_bus_message *incoming = NULL;
2006 incoming = bus->rqueue[i];
2008 if (incoming->reply_cookie == cookie) {
2009 /* Found a match! */
2011 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2013 log_debug_bus_message(incoming);
2015 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2017 if (incoming->n_fds <= 0 || (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2021 sd_bus_message_unref(incoming);
2026 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2028 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR)
2029 r = sd_bus_error_copy(error, &incoming->error);
2033 sd_bus_message_unref(incoming);
2036 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2039 streq(bus->unique_name, incoming->sender)) {
2041 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2044 /* Our own message? Somebody is trying
2045 * to send its own client a message,
2046 * let's not dead-lock, let's fail
2049 sd_bus_message_unref(incoming);
2053 /* Try to read more, right-away */
2057 r = bus_read_message(bus, false, 0);
2059 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2060 bus_enter_closing(bus);
2072 n = now(CLOCK_MONOTONIC);
2078 left = (uint64_t) -1;
2080 r = bus_poll(bus, true, left);
2086 r = dispatch_wqueue(bus);
2088 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2089 bus_enter_closing(bus);
2098 _public_ int sd_bus_get_fd(sd_bus *bus) {
2100 assert_return(bus, -EINVAL);
2101 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2102 assert_return(!bus_pid_changed(bus), -ECHILD);
2104 return bus->input_fd;
2107 _public_ int sd_bus_get_events(sd_bus *bus) {
2110 assert_return(bus, -EINVAL);
2111 assert_return(!bus_pid_changed(bus), -ECHILD);
2113 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2116 if (bus->state == BUS_OPENING)
2118 else if (bus->state == BUS_AUTHENTICATING) {
2120 if (bus_socket_auth_needs_write(bus))
2125 } else if (bus->state == BUS_RUNNING || bus->state == BUS_HELLO) {
2126 if (bus->rqueue_size <= 0)
2128 if (bus->wqueue_size > 0)
2135 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2136 struct reply_callback *c;
2138 assert_return(bus, -EINVAL);
2139 assert_return(timeout_usec, -EINVAL);
2140 assert_return(!bus_pid_changed(bus), -ECHILD);
2142 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2145 if (bus->track_queue) {
2150 if (bus->state == BUS_CLOSING) {
2155 if (bus->state == BUS_AUTHENTICATING) {
2156 *timeout_usec = bus->auth_timeout;
2160 if (bus->state != BUS_RUNNING && bus->state != BUS_HELLO) {
2161 *timeout_usec = (uint64_t) -1;
2165 if (bus->rqueue_size > 0) {
2170 c = prioq_peek(bus->reply_callbacks_prioq);
2172 *timeout_usec = (uint64_t) -1;
2176 if (c->timeout == 0) {
2177 *timeout_usec = (uint64_t) -1;
2181 *timeout_usec = c->timeout;
2185 static int process_timeout(sd_bus *bus) {
2186 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2187 _cleanup_bus_message_unref_ sd_bus_message* m = NULL;
2188 struct reply_callback *c;
2195 c = prioq_peek(bus->reply_callbacks_prioq);
2199 n = now(CLOCK_MONOTONIC);
2203 r = bus_message_new_synthetic_error(
2206 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2211 r = bus_seal_synthetic_message(bus, m);
2215 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2218 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2221 slot = container_of(c, sd_bus_slot, reply_callback);
2223 bus->iteration_counter ++;
2225 bus->current_message = m;
2226 bus->current_slot = sd_bus_slot_ref(slot);
2227 bus->current_handler = c->callback;
2228 bus->current_userdata = slot->userdata;
2229 r = c->callback(m, slot->userdata, &error_buffer);
2230 bus->current_userdata = NULL;
2231 bus->current_handler = NULL;
2232 bus->current_slot = NULL;
2233 bus->current_message = NULL;
2235 if (slot->floating) {
2236 bus_slot_disconnect(slot);
2237 sd_bus_slot_unref(slot);
2240 sd_bus_slot_unref(slot);
2242 return bus_maybe_reply_error(m, r, &error_buffer);
2245 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2249 if (bus->state != BUS_HELLO)
2252 /* Let's make sure the first message on the bus is the HELLO
2253 * reply. But note that we don't actually parse the message
2254 * here (we leave that to the usual handling), we just verify
2255 * we don't let any earlier msg through. */
2257 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2258 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2261 if (m->reply_cookie != 1)
2267 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2268 _cleanup_bus_message_unref_ sd_bus_message *synthetic_reply = NULL;
2269 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2270 struct reply_callback *c;
2277 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2278 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2281 if (bus->is_kernel && (bus->hello_flags & KDBUS_HELLO_MONITOR))
2284 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2287 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2293 slot = container_of(c, sd_bus_slot, reply_callback);
2295 if (m->n_fds > 0 && !(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2297 /* If the reply contained a file descriptor which we
2298 * didn't want we pass an error instead. */
2300 r = bus_message_new_synthetic_error(
2303 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2308 /* Copy over original timestamp */
2309 synthetic_reply->realtime = m->realtime;
2310 synthetic_reply->monotonic = m->monotonic;
2311 synthetic_reply->seqnum = m->seqnum;
2313 r = bus_seal_synthetic_message(bus, synthetic_reply);
2317 m = synthetic_reply;
2319 r = sd_bus_message_rewind(m, true);
2324 if (c->timeout != 0) {
2325 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2329 bus->current_slot = sd_bus_slot_ref(slot);
2330 bus->current_handler = c->callback;
2331 bus->current_userdata = slot->userdata;
2332 r = c->callback(m, slot->userdata, &error_buffer);
2333 bus->current_userdata = NULL;
2334 bus->current_handler = NULL;
2335 bus->current_slot = NULL;
2337 if (slot->floating) {
2338 bus_slot_disconnect(slot);
2339 sd_bus_slot_unref(slot);
2342 sd_bus_slot_unref(slot);
2344 return bus_maybe_reply_error(m, r, &error_buffer);
2347 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2348 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2349 struct filter_callback *l;
2356 bus->filter_callbacks_modified = false;
2358 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2361 if (bus->filter_callbacks_modified)
2364 /* Don't run this more than once per iteration */
2365 if (l->last_iteration == bus->iteration_counter)
2368 l->last_iteration = bus->iteration_counter;
2370 r = sd_bus_message_rewind(m, true);
2374 slot = container_of(l, sd_bus_slot, filter_callback);
2376 bus->current_slot = sd_bus_slot_ref(slot);
2377 bus->current_handler = l->callback;
2378 bus->current_userdata = slot->userdata;
2379 r = l->callback(m, slot->userdata, &error_buffer);
2380 bus->current_userdata = NULL;
2381 bus->current_handler = NULL;
2382 bus->current_slot = sd_bus_slot_unref(slot);
2384 r = bus_maybe_reply_error(m, r, &error_buffer);
2390 } while (bus->filter_callbacks_modified);
2395 static int process_match(sd_bus *bus, sd_bus_message *m) {
2402 bus->match_callbacks_modified = false;
2404 r = bus_match_run(bus, &bus->match_callbacks, m);
2408 } while (bus->match_callbacks_modified);
2413 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2414 _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
2420 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2423 if (bus->manual_peer_interface)
2426 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2429 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2432 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2435 if (streq_ptr(m->member, "Ping"))
2436 r = sd_bus_message_new_method_return(m, &reply);
2437 else if (streq_ptr(m->member, "GetMachineId")) {
2441 r = sd_id128_get_machine(&id);
2445 r = sd_bus_message_new_method_return(m, &reply);
2449 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2451 r = sd_bus_message_new_method_errorf(
2453 SD_BUS_ERROR_UNKNOWN_METHOD,
2454 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2460 r = sd_bus_send(bus, reply, NULL);
2467 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2471 /* If we got a message with a file descriptor which we didn't
2472 * want to accept, then let's drop it. How can this even
2473 * happen? For example, when the kernel queues a message into
2474 * an activatable names's queue which allows fds, and then is
2475 * delivered to us later even though we ourselves did not
2478 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2484 if (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)
2487 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2488 return 1; /* just eat it up */
2490 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2493 static int process_message(sd_bus *bus, sd_bus_message *m) {
2499 bus->current_message = m;
2500 bus->iteration_counter++;
2502 log_debug_bus_message(m);
2504 r = process_hello(bus, m);
2508 r = process_reply(bus, m);
2512 r = process_fd_check(bus, m);
2516 r = process_filter(bus, m);
2520 r = process_match(bus, m);
2524 r = process_builtin(bus, m);
2528 r = bus_process_object(bus, m);
2531 bus->current_message = NULL;
2535 static int dispatch_track(sd_bus *bus) {
2538 if (!bus->track_queue)
2541 bus_track_dispatch(bus->track_queue);
2545 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2546 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2550 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
2552 r = process_timeout(bus);
2556 r = dispatch_wqueue(bus);
2560 r = dispatch_track(bus);
2564 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2570 r = process_message(bus, m);
2575 r = sd_bus_message_rewind(m, true);
2584 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2586 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2587 strna(sd_bus_message_get_sender(m)),
2588 strna(sd_bus_message_get_path(m)),
2589 strna(sd_bus_message_get_interface(m)),
2590 strna(sd_bus_message_get_member(m)));
2592 r = sd_bus_reply_method_errorf(
2594 SD_BUS_ERROR_UNKNOWN_OBJECT,
2595 "Unknown object '%s'.", m->path);
2609 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2610 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2611 struct reply_callback *c;
2615 assert(bus->state == BUS_CLOSING);
2617 c = ordered_hashmap_first(bus->reply_callbacks);
2619 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2622 /* First, fail all outstanding method calls */
2623 r = bus_message_new_synthetic_error(
2626 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2631 r = bus_seal_synthetic_message(bus, m);
2635 if (c->timeout != 0) {
2636 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2640 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2643 slot = container_of(c, sd_bus_slot, reply_callback);
2645 bus->iteration_counter++;
2647 bus->current_message = m;
2648 bus->current_slot = sd_bus_slot_ref(slot);
2649 bus->current_handler = c->callback;
2650 bus->current_userdata = slot->userdata;
2651 r = c->callback(m, slot->userdata, &error_buffer);
2652 bus->current_userdata = NULL;
2653 bus->current_handler = NULL;
2654 bus->current_slot = NULL;
2655 bus->current_message = NULL;
2657 if (slot->floating) {
2658 bus_slot_disconnect(slot);
2659 sd_bus_slot_unref(slot);
2662 sd_bus_slot_unref(slot);
2664 return bus_maybe_reply_error(m, r, &error_buffer);
2667 /* Then, synthesize a Disconnected message */
2668 r = sd_bus_message_new_signal(
2671 "/org/freedesktop/DBus/Local",
2672 "org.freedesktop.DBus.Local",
2677 bus_message_set_sender_local(bus, m);
2679 r = bus_seal_synthetic_message(bus, m);
2685 bus->current_message = m;
2686 bus->iteration_counter++;
2688 r = process_filter(bus, m);
2692 r = process_match(bus, m);
2704 bus->current_message = NULL;
2709 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2710 BUS_DONT_DESTROY(bus);
2713 /* Returns 0 when we didn't do anything. This should cause the
2714 * caller to invoke sd_bus_wait() before returning the next
2715 * time. Returns > 0 when we did something, which possibly
2716 * means *ret is filled in with an unprocessed message. */
2718 assert_return(bus, -EINVAL);
2719 assert_return(!bus_pid_changed(bus), -ECHILD);
2721 /* We don't allow recursively invoking sd_bus_process(). */
2722 assert_return(!bus->current_message, -EBUSY);
2723 assert(!bus->current_slot);
2725 switch (bus->state) {
2734 r = bus_socket_process_opening(bus);
2735 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2736 bus_enter_closing(bus);
2744 case BUS_AUTHENTICATING:
2745 r = bus_socket_process_authenticating(bus);
2746 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2747 bus_enter_closing(bus);
2759 r = process_running(bus, hint_priority, priority, ret);
2760 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2761 bus_enter_closing(bus);
2771 return process_closing(bus, ret);
2774 assert_not_reached("Unknown state");
2777 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2778 return bus_process_internal(bus, false, 0, ret);
2781 /// UNNEEDED by elogind
2783 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2784 return bus_process_internal(bus, true, priority, ret);
2788 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2789 struct pollfd p[2] = {};
2792 usec_t m = USEC_INFINITY;
2796 if (bus->state == BUS_CLOSING)
2799 if (!BUS_IS_OPEN(bus->state))
2802 e = sd_bus_get_events(bus);
2807 /* The caller really needs some more data, he doesn't
2808 * care about what's already read, or any timeouts
2809 * except its own. */
2813 /* The caller wants to process if there's something to
2814 * process, but doesn't care otherwise */
2816 r = sd_bus_get_timeout(bus, &until);
2821 nw = now(CLOCK_MONOTONIC);
2822 m = until > nw ? until - nw : 0;
2826 if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
2829 p[0].fd = bus->input_fd;
2830 if (bus->output_fd == bus->input_fd) {
2834 p[0].events = e & POLLIN;
2835 p[1].fd = bus->output_fd;
2836 p[1].events = e & POLLOUT;
2840 r = ppoll(p, n, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
2844 return r > 0 ? 1 : 0;
2847 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2849 assert_return(bus, -EINVAL);
2850 assert_return(!bus_pid_changed(bus), -ECHILD);
2852 if (bus->state == BUS_CLOSING)
2855 if (!BUS_IS_OPEN(bus->state))
2858 if (bus->rqueue_size > 0)
2861 return bus_poll(bus, false, timeout_usec);
2864 _public_ int sd_bus_flush(sd_bus *bus) {
2867 assert_return(bus, -EINVAL);
2868 assert_return(!bus_pid_changed(bus), -ECHILD);
2870 if (bus->state == BUS_CLOSING)
2873 if (!BUS_IS_OPEN(bus->state))
2876 r = bus_ensure_running(bus);
2880 if (bus->wqueue_size <= 0)
2884 r = dispatch_wqueue(bus);
2886 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2887 bus_enter_closing(bus);
2894 if (bus->wqueue_size <= 0)
2897 r = bus_poll(bus, false, (uint64_t) -1);
2903 _public_ int sd_bus_add_filter(
2906 sd_bus_message_handler_t callback,
2911 assert_return(bus, -EINVAL);
2912 assert_return(callback, -EINVAL);
2913 assert_return(!bus_pid_changed(bus), -ECHILD);
2915 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
2919 s->filter_callback.callback = callback;
2921 bus->filter_callbacks_modified = true;
2922 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
2930 _public_ int sd_bus_add_match(
2934 sd_bus_message_handler_t callback,
2937 struct bus_match_component *components = NULL;
2938 unsigned n_components = 0;
2939 sd_bus_slot *s = NULL;
2942 assert_return(bus, -EINVAL);
2943 assert_return(match, -EINVAL);
2944 assert_return(!bus_pid_changed(bus), -ECHILD);
2946 r = bus_match_parse(match, &components, &n_components);
2950 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
2956 s->match_callback.callback = callback;
2957 s->match_callback.cookie = ++bus->match_cookie;
2959 if (bus->bus_client) {
2960 enum bus_match_scope scope;
2962 scope = bus_match_get_scope(components, n_components);
2964 /* Do not install server-side matches for matches
2965 * against the local service, interface or bus
2967 if (scope != BUS_MATCH_LOCAL) {
2969 if (!bus->is_kernel) {
2970 /* When this is not a kernel transport, we
2971 * store the original match string, so that we
2972 * can use it to remove the match again */
2974 s->match_callback.match_string = strdup(match);
2975 if (!s->match_callback.match_string) {
2981 r = bus_add_match_internal(bus, s->match_callback.match_string, components, n_components, s->match_callback.cookie);
2985 s->match_added = true;
2989 bus->match_callbacks_modified = true;
2990 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
2999 bus_match_parse_free(components, n_components);
3000 sd_bus_slot_unref(s);
3005 /// UNNEEDED by elogind
3007 int bus_remove_match_by_string(
3010 sd_bus_message_handler_t callback,
3013 struct bus_match_component *components = NULL;
3014 unsigned n_components = 0;
3015 struct match_callback *c;
3018 assert_return(bus, -EINVAL);
3019 assert_return(match, -EINVAL);
3020 assert_return(!bus_pid_changed(bus), -ECHILD);
3022 r = bus_match_parse(match, &components, &n_components);
3026 r = bus_match_find(&bus->match_callbacks, components, n_components, NULL, NULL, &c);
3030 sd_bus_slot_unref(container_of(c, sd_bus_slot, match_callback));
3033 bus_match_parse_free(components, n_components);
3039 bool bus_pid_changed(sd_bus *bus) {
3042 /* We don't support people creating a bus connection and
3043 * keeping it around over a fork(). Let's complain. */
3045 return bus->original_pid != getpid();
3048 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3049 sd_bus *bus = userdata;
3054 r = sd_bus_process(bus, NULL);
3061 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3062 sd_bus *bus = userdata;
3067 r = sd_bus_process(bus, NULL);
3074 static int prepare_callback(sd_event_source *s, void *userdata) {
3075 sd_bus *bus = userdata;
3082 e = sd_bus_get_events(bus);
3086 if (bus->output_fd != bus->input_fd) {
3088 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3092 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3096 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3101 r = sd_bus_get_timeout(bus, &until);
3107 j = sd_event_source_set_time(bus->time_event_source, until);
3112 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3119 static int quit_callback(sd_event_source *event, void *userdata) {
3120 sd_bus *bus = userdata;
3130 static int attach_io_events(sd_bus *bus) {
3135 if (bus->input_fd < 0)
3141 if (!bus->input_io_event_source) {
3142 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3146 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3150 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3154 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3156 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3161 if (bus->output_fd != bus->input_fd) {
3162 assert(bus->output_fd >= 0);
3164 if (!bus->output_io_event_source) {
3165 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3169 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3173 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3175 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3184 static void detach_io_events(sd_bus *bus) {
3187 if (bus->input_io_event_source) {
3188 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3189 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3192 if (bus->output_io_event_source) {
3193 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3194 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3198 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3201 assert_return(bus, -EINVAL);
3202 assert_return(!bus->event, -EBUSY);
3204 assert(!bus->input_io_event_source);
3205 assert(!bus->output_io_event_source);
3206 assert(!bus->time_event_source);
3209 bus->event = sd_event_ref(event);
3211 r = sd_event_default(&bus->event);
3216 bus->event_priority = priority;
3218 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3222 r = sd_event_source_set_priority(bus->time_event_source, priority);
3226 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3230 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3234 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3238 r = attach_io_events(bus);
3245 sd_bus_detach_event(bus);
3249 _public_ int sd_bus_detach_event(sd_bus *bus) {
3250 assert_return(bus, -EINVAL);
3255 detach_io_events(bus);
3257 if (bus->time_event_source) {
3258 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3259 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3262 if (bus->quit_event_source) {
3263 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3264 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3267 bus->event = sd_event_unref(bus->event);
3271 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3272 assert_return(bus, NULL);
3277 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3278 assert_return(bus, NULL);
3280 return bus->current_message;
3283 /// UNNEEDED by elogind
3285 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3286 assert_return(bus, NULL);
3288 return bus->current_slot;
3292 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3293 assert_return(bus, NULL);
3295 return bus->current_handler;
3298 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3299 assert_return(bus, NULL);
3301 return bus->current_userdata;
3304 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3309 assert(default_bus);
3312 return !!*default_bus;
3315 *ret = sd_bus_ref(*default_bus);
3323 b->default_bus_ptr = default_bus;
3331 _public_ int sd_bus_default_system(sd_bus **ret) {
3332 static thread_local sd_bus *default_system_bus = NULL;
3334 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3337 _public_ int sd_bus_default_user(sd_bus **ret) {
3338 static thread_local sd_bus *default_user_bus = NULL;
3340 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3343 _public_ int sd_bus_default(sd_bus **ret) {
3347 /* Let's try our best to reuse another cached connection. If
3348 * the starter bus type is set, connect via our normal
3349 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3350 * we can share the connection with the user/system default
3353 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3355 if (streq(e, "system"))
3356 return sd_bus_default_system(ret);
3357 else if (STR_IN_SET(e, "user", "session"))
3358 return sd_bus_default_user(ret);
3361 /* No type is specified, so we have not other option than to
3362 * use the starter address if it is set. */
3364 e = secure_getenv("DBUS_STARTER_ADDRESS");
3366 static thread_local sd_bus *default_starter_bus = NULL;
3368 return bus_default(sd_bus_open, &default_starter_bus, ret);
3371 /* Finally, if nothing is set use the cached connection for
3372 * the right scope */
3374 return sd_bus_default_system(ret);
3377 /// UNNEEDED by elogind
3379 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3380 assert_return(b, -EINVAL);
3381 assert_return(tid, -EINVAL);
3382 assert_return(!bus_pid_changed(b), -ECHILD);
3390 return sd_event_get_tid(b->event, tid);
3395 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3396 _cleanup_free_ char *e = NULL;
3399 assert_return(object_path_is_valid(prefix), -EINVAL);
3400 assert_return(external_id, -EINVAL);
3401 assert_return(ret_path, -EINVAL);
3403 e = bus_label_escape(external_id);
3407 ret = strjoin(prefix, "/", e, NULL);
3415 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3419 assert_return(object_path_is_valid(path), -EINVAL);
3420 assert_return(object_path_is_valid(prefix), -EINVAL);
3421 assert_return(external_id, -EINVAL);
3423 e = object_path_startswith(path, prefix);
3425 *external_id = NULL;
3429 ret = bus_label_unescape(e);
3438 _public_ int sd_bus_try_close(sd_bus *bus) {
3441 assert_return(bus, -EINVAL);
3442 assert_return(!bus_pid_changed(bus), -ECHILD);
3444 if (!bus->is_kernel)
3447 if (!BUS_IS_OPEN(bus->state))
3450 if (bus->rqueue_size > 0)
3453 if (bus->wqueue_size > 0)
3456 r = bus_kernel_try_close(bus);
3464 /// UNNEEDED by elogind
3466 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3467 assert_return(bus, -EINVAL);
3468 assert_return(description, -EINVAL);
3469 assert_return(bus->description, -ENXIO);
3470 assert_return(!bus_pid_changed(bus), -ECHILD);
3472 *description = bus->description;
3477 int bus_get_root_path(sd_bus *bus) {
3480 if (bus->cgroup_root)
3483 r = cg_get_root_path(&bus->cgroup_root);
3485 bus->cgroup_root = strdup("/");
3486 if (!bus->cgroup_root)
3495 /// UNNEEDED by elogind
3497 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3500 assert_return(bus, -EINVAL);
3501 assert_return(scope, -EINVAL);
3502 assert_return(!bus_pid_changed(bus), -ECHILD);
3504 if (bus->is_kernel) {
3505 _cleanup_free_ char *n = NULL;
3508 r = bus_kernel_get_bus_name(bus, &n);
3512 if (streq(n, "0-system")) {
3517 dash = strchr(n, '-');
3518 if (streq_ptr(dash, "-user")) {
3529 if (bus->is_system) {
3537 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3539 assert_return(bus, -EINVAL);
3540 assert_return(address, -EINVAL);
3541 assert_return(!bus_pid_changed(bus), -ECHILD);
3544 *address = bus->address;
3551 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
3552 assert_return(bus, -EINVAL);
3553 assert_return(mask, -EINVAL);
3554 assert_return(!bus_pid_changed(bus), -ECHILD);
3556 *mask = bus->creds_mask;
3560 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
3561 assert_return(bus, -EINVAL);
3562 assert_return(!bus_pid_changed(bus), -ECHILD);
3564 return bus->bus_client;
3567 _public_ int sd_bus_is_server(sd_bus *bus) {
3568 assert_return(bus, -EINVAL);
3569 assert_return(!bus_pid_changed(bus), -ECHILD);
3571 return bus->is_server;
3574 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
3575 assert_return(bus, -EINVAL);
3576 assert_return(!bus_pid_changed(bus), -ECHILD);
3578 return bus->anonymous_auth;
3581 _public_ int sd_bus_is_trusted(sd_bus *bus) {
3582 assert_return(bus, -EINVAL);
3583 assert_return(!bus_pid_changed(bus), -ECHILD);
3585 return bus->trusted;
3588 _public_ int sd_bus_is_monitor(sd_bus *bus) {
3589 assert_return(bus, -EINVAL);
3590 assert_return(!bus_pid_changed(bus), -ECHILD);
3592 return !!(bus->hello_flags & KDBUS_HELLO_MONITOR);