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]);
89 b->rqueue_allocated = 0;
91 while (b->wqueue_size > 0)
92 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
96 b->wqueue_allocated = 0;
99 static void bus_free(sd_bus *b) {
103 assert(!b->track_queue);
105 b->state = BUS_CLOSED;
107 sd_bus_detach_event(b);
109 while ((s = b->slots)) {
110 /* At this point only floating slots can still be
111 * around, because the non-floating ones keep a
112 * reference to the bus, and we thus couldn't be
113 * destructing right now... We forcibly disconnect the
114 * slots here, so that they still can be referenced by
115 * apps, but are dead. */
118 bus_slot_disconnect(s);
119 sd_bus_slot_unref(s);
122 if (b->default_bus_ptr)
123 *b->default_bus_ptr = NULL;
128 munmap(b->kdbus_buffer, KDBUS_POOL_SIZE);
132 free(b->unique_name);
133 free(b->auth_buffer);
138 free(b->cgroup_root);
139 free(b->description);
142 strv_free(b->exec_argv);
144 close_many(b->fds, b->n_fds);
149 ordered_hashmap_free_free(b->reply_callbacks);
150 prioq_free(b->reply_callbacks_prioq);
152 assert(b->match_callbacks.type == BUS_MATCH_ROOT);
153 bus_match_free(&b->match_callbacks);
155 hashmap_free_free(b->vtable_methods);
156 hashmap_free_free(b->vtable_properties);
158 assert(hashmap_isempty(b->nodes));
159 hashmap_free(b->nodes);
161 bus_kernel_flush_memfd(b);
163 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
168 _public_ int sd_bus_new(sd_bus **ret) {
171 assert_return(ret, -EINVAL);
177 r->n_ref = REFCNT_INIT;
178 r->input_fd = r->output_fd = -1;
179 r->message_version = 1;
180 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
181 r->hello_flags |= KDBUS_HELLO_ACCEPT_FD;
182 r->attach_flags |= KDBUS_ATTACH_NAMES;
183 r->original_pid = getpid();
185 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
187 /* We guarantee that wqueue always has space for at least one
189 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
198 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
201 assert_return(bus, -EINVAL);
202 assert_return(bus->state == BUS_UNSET, -EPERM);
203 assert_return(address, -EINVAL);
204 assert_return(!bus_pid_changed(bus), -ECHILD);
216 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
217 assert_return(bus, -EINVAL);
218 assert_return(bus->state == BUS_UNSET, -EPERM);
219 assert_return(input_fd >= 0, -EINVAL);
220 assert_return(output_fd >= 0, -EINVAL);
221 assert_return(!bus_pid_changed(bus), -ECHILD);
223 bus->input_fd = input_fd;
224 bus->output_fd = output_fd;
228 /// UNNEEDED by elogind
230 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
233 assert_return(bus, -EINVAL);
234 assert_return(bus->state == BUS_UNSET, -EPERM);
235 assert_return(path, -EINVAL);
236 assert_return(!strv_isempty(argv), -EINVAL);
237 assert_return(!bus_pid_changed(bus), -ECHILD);
249 free(bus->exec_path);
250 strv_free(bus->exec_argv);
258 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
259 assert_return(bus, -EINVAL);
260 assert_return(bus->state == BUS_UNSET, -EPERM);
261 assert_return(!bus_pid_changed(bus), -ECHILD);
263 bus->bus_client = !!b;
267 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
268 assert_return(bus, -EINVAL);
269 assert_return(bus->state == BUS_UNSET, -EPERM);
270 assert_return(!bus_pid_changed(bus), -ECHILD);
272 SET_FLAG(bus->hello_flags, KDBUS_HELLO_MONITOR, b);
276 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
277 assert_return(bus, -EINVAL);
278 assert_return(bus->state == BUS_UNSET, -EPERM);
279 assert_return(!bus_pid_changed(bus), -ECHILD);
281 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ACCEPT_FD, b);
285 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
287 assert_return(bus, -EINVAL);
288 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
289 assert_return(!bus_pid_changed(bus), -ECHILD);
291 new_flags = bus->attach_flags;
292 SET_FLAG(new_flags, KDBUS_ATTACH_TIMESTAMP, b);
294 if (bus->attach_flags == new_flags)
297 bus->attach_flags = new_flags;
298 if (bus->state != BUS_UNSET && bus->is_kernel)
299 bus_kernel_realize_attach_flags(bus);
305 _public_ int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t mask) {
308 assert_return(bus, -EINVAL);
309 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
310 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
311 assert_return(!bus_pid_changed(bus), -ECHILD);
314 bus->creds_mask |= mask;
316 bus->creds_mask &= ~mask;
318 /* The well knowns we need unconditionally, so that matches can work */
319 bus->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
321 /* Make sure we don't lose the timestamp flag */
322 new_flags = (bus->attach_flags & KDBUS_ATTACH_TIMESTAMP) | attach_flags_to_kdbus(bus->creds_mask);
323 if (bus->attach_flags == new_flags)
326 bus->attach_flags = new_flags;
327 if (bus->state != BUS_UNSET && bus->is_kernel)
328 bus_kernel_realize_attach_flags(bus);
333 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
334 assert_return(bus, -EINVAL);
335 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
336 assert_return(bus->state == BUS_UNSET, -EPERM);
337 assert_return(!bus_pid_changed(bus), -ECHILD);
339 bus->is_server = !!b;
340 bus->server_id = server_id;
344 /// UNNEEDED by elogind
346 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
347 assert_return(bus, -EINVAL);
348 assert_return(bus->state == BUS_UNSET, -EPERM);
349 assert_return(!bus_pid_changed(bus), -ECHILD);
351 bus->anonymous_auth = !!b;
355 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
356 assert_return(bus, -EINVAL);
357 assert_return(bus->state == BUS_UNSET, -EPERM);
358 assert_return(!bus_pid_changed(bus), -ECHILD);
364 _public_ int sd_bus_set_description(sd_bus *bus, const char *description) {
365 assert_return(bus, -EINVAL);
366 assert_return(bus->state == BUS_UNSET, -EPERM);
367 assert_return(!bus_pid_changed(bus), -ECHILD);
369 return free_and_strdup(&bus->description, description);
373 _public_ int sd_bus_set_allow_interactive_authorization(sd_bus *bus, int b) {
374 assert_return(bus, -EINVAL);
375 assert_return(!bus_pid_changed(bus), -ECHILD);
377 bus->allow_interactive_authorization = !!b;
381 /// UNNEEDED by elogind
383 _public_ int sd_bus_get_allow_interactive_authorization(sd_bus *bus) {
384 assert_return(bus, -EINVAL);
385 assert_return(!bus_pid_changed(bus), -ECHILD);
387 return bus->allow_interactive_authorization;
391 static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) {
399 assert(bus->state == BUS_HELLO || bus->state == BUS_CLOSING);
401 r = sd_bus_message_get_errno(reply);
405 r = sd_bus_message_read(reply, "s", &s);
409 if (!service_name_is_valid(s) || s[0] != ':')
412 bus->unique_name = strdup(s);
413 if (!bus->unique_name)
416 if (bus->state == BUS_HELLO)
417 bus->state = BUS_RUNNING;
422 static int bus_send_hello(sd_bus *bus) {
423 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
428 if (!bus->bus_client || bus->is_kernel)
431 r = sd_bus_message_new_method_call(
434 "org.freedesktop.DBus",
435 "/org/freedesktop/DBus",
436 "org.freedesktop.DBus",
441 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
444 int bus_start_running(sd_bus *bus) {
447 if (bus->bus_client && !bus->is_kernel) {
448 bus->state = BUS_HELLO;
452 bus->state = BUS_RUNNING;
456 static int parse_address_key(const char **p, const char *key, char **value) {
457 size_t l, n = 0, allocated = 0;
467 if (strncmp(*p, key, l) != 0)
480 while (*a != ';' && *a != ',' && *a != 0) {
498 c = (char) ((x << 4) | y);
505 if (!GREEDY_REALLOC(r, allocated, n + 2))
529 static void skip_address_key(const char **p) {
533 *p += strcspn(*p, ",");
539 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
540 _cleanup_free_ char *path = NULL, *abstract = NULL;
549 while (**p != 0 && **p != ';') {
550 r = parse_address_key(p, "guid", guid);
556 r = parse_address_key(p, "path", &path);
562 r = parse_address_key(p, "abstract", &abstract);
571 if (!path && !abstract)
574 if (path && abstract)
579 if (l > sizeof(b->sockaddr.un.sun_path))
582 b->sockaddr.un.sun_family = AF_UNIX;
583 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
584 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
585 } else if (abstract) {
586 l = strlen(abstract);
587 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
590 b->sockaddr.un.sun_family = AF_UNIX;
591 b->sockaddr.un.sun_path[0] = 0;
592 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
593 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
599 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
600 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
602 struct addrinfo *result, hints = {
603 .ai_socktype = SOCK_STREAM,
604 .ai_flags = AI_ADDRCONFIG,
612 while (**p != 0 && **p != ';') {
613 r = parse_address_key(p, "guid", guid);
619 r = parse_address_key(p, "host", &host);
625 r = parse_address_key(p, "port", &port);
631 r = parse_address_key(p, "family", &family);
644 if (streq(family, "ipv4"))
645 hints.ai_family = AF_INET;
646 else if (streq(family, "ipv6"))
647 hints.ai_family = AF_INET6;
652 r = getaddrinfo(host, port, &hints, &result);
656 return -EADDRNOTAVAIL;
658 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
659 b->sockaddr_size = result->ai_addrlen;
661 freeaddrinfo(result);
666 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
668 unsigned n_argv = 0, j;
670 size_t allocated = 0;
678 while (**p != 0 && **p != ';') {
679 r = parse_address_key(p, "guid", guid);
685 r = parse_address_key(p, "path", &path);
691 if (startswith(*p, "argv")) {
695 ul = strtoul(*p + 4, (char**) p, 10);
696 if (errno > 0 || **p != '=' || ul > 256) {
704 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
712 r = parse_address_key(p, NULL, argv + ul);
727 /* Make sure there are no holes in the array, with the
728 * exception of argv[0] */
729 for (j = 1; j < n_argv; j++)
735 if (argv && argv[0] == NULL) {
736 argv[0] = strdup(path);
748 for (j = 0; j < n_argv; j++)
756 static int parse_kernel_address(sd_bus *b, const char **p, char **guid) {
757 _cleanup_free_ char *path = NULL;
765 while (**p != 0 && **p != ';') {
766 r = parse_address_key(p, "guid", guid);
772 r = parse_address_key(p, "path", &path);
791 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
792 _cleanup_free_ char *machine = NULL, *pid = NULL;
800 while (**p != 0 && **p != ';') {
801 r = parse_address_key(p, "guid", guid);
807 r = parse_address_key(p, "machine", &machine);
813 r = parse_address_key(p, "pid", &pid);
822 if (!machine == !pid)
826 if (!machine_name_is_valid(machine))
830 b->machine = machine;
838 r = parse_pid(pid, &b->nspid);
844 b->sockaddr.un.sun_family = AF_UNIX;
845 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
846 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + strlen("/var/run/dbus/system_bus_socket");
851 static int parse_container_kernel_address(sd_bus *b, const char **p, char **guid) {
852 _cleanup_free_ char *machine = NULL, *pid = NULL;
860 while (**p != 0 && **p != ';') {
861 r = parse_address_key(p, "guid", guid);
867 r = parse_address_key(p, "machine", &machine);
873 r = parse_address_key(p, "pid", &pid);
882 if (!machine == !pid)
886 if (!machine_name_is_valid(machine))
890 b->machine = machine;
898 r = parse_pid(pid, &b->nspid);
905 b->kernel = strdup("/sys/fs/kdbus/0-system/bus");
912 static void bus_reset_parsed_address(sd_bus *b) {
916 b->sockaddr_size = 0;
917 strv_free(b->exec_argv);
921 b->server_id = SD_ID128_NULL;
929 static int bus_parse_next_address(sd_bus *b) {
930 _cleanup_free_ char *guid = NULL;
938 if (b->address[b->address_index] == 0)
941 bus_reset_parsed_address(b);
943 a = b->address + b->address_index;
952 if (startswith(a, "unix:")) {
955 r = parse_unix_address(b, &a, &guid);
960 } else if (startswith(a, "tcp:")) {
963 r = parse_tcp_address(b, &a, &guid);
969 } else if (startswith(a, "unixexec:")) {
972 r = parse_exec_address(b, &a, &guid);
978 } else if (startswith(a, "kernel:")) {
981 r = parse_kernel_address(b, &a, &guid);
986 } else if (startswith(a, "x-machine-unix:")) {
989 r = parse_container_unix_address(b, &a, &guid);
994 } else if (startswith(a, "x-machine-kernel:")) {
997 r = parse_container_kernel_address(b, &a, &guid);
1010 r = sd_id128_from_string(guid, &b->server_id);
1015 b->address_index = a - b->address;
1019 static int bus_start_address(sd_bus *b) {
1025 bool skipped = false;
1030 r = bus_socket_exec(b);
1032 else if ((b->nspid > 0 || b->machine) && b->kernel)
1033 r = bus_container_connect_kernel(b);
1034 else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC)
1035 r = bus_container_connect_socket(b);
1038 r = bus_kernel_connect(b);
1039 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
1040 r = bus_socket_connect(b);
1046 r = attach_io_events(b);
1051 b->last_connect_error = -r;
1054 r = bus_parse_next_address(b);
1058 return b->last_connect_error ? -b->last_connect_error : -ECONNREFUSED;
1062 int bus_next_address(sd_bus *b) {
1065 bus_reset_parsed_address(b);
1066 return bus_start_address(b);
1069 static int bus_start_fd(sd_bus *b) {
1074 assert(b->input_fd >= 0);
1075 assert(b->output_fd >= 0);
1077 r = fd_nonblock(b->input_fd, true);
1081 r = fd_cloexec(b->input_fd, true);
1085 if (b->input_fd != b->output_fd) {
1086 r = fd_nonblock(b->output_fd, true);
1090 r = fd_cloexec(b->output_fd, true);
1095 if (fstat(b->input_fd, &st) < 0)
1098 if (S_ISCHR(b->input_fd))
1099 return bus_kernel_take_fd(b);
1101 return bus_socket_take_fd(b);
1104 _public_ int sd_bus_start(sd_bus *bus) {
1107 assert_return(bus, -EINVAL);
1108 assert_return(bus->state == BUS_UNSET, -EPERM);
1109 assert_return(!bus_pid_changed(bus), -ECHILD);
1111 bus->state = BUS_OPENING;
1113 if (bus->is_server && bus->bus_client)
1116 if (bus->input_fd >= 0)
1117 r = bus_start_fd(bus);
1118 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->kernel || bus->machine)
1119 r = bus_start_address(bus);
1128 return bus_send_hello(bus);
1131 _public_ int sd_bus_open(sd_bus **ret) {
1136 assert_return(ret, -EINVAL);
1138 /* Let's connect to the starter bus if it is set, and
1139 * otherwise to the bus that is appropropriate for the scope
1140 * we are running in */
1142 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1144 if (streq(e, "system"))
1145 return sd_bus_open_system(ret);
1146 else if (STR_IN_SET(e, "session", "user"))
1147 return sd_bus_open_user(ret);
1150 e = secure_getenv("DBUS_STARTER_ADDRESS");
1152 return sd_bus_open_system(ret);
1159 r = sd_bus_set_address(b, e);
1163 b->bus_client = true;
1165 /* We don't know whether the bus is trusted or not, so better
1166 * be safe, and authenticate everything */
1168 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1169 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1171 r = sd_bus_start(b);
1183 int bus_set_address_system(sd_bus *b) {
1187 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1189 return sd_bus_set_address(b, e);
1191 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1194 _public_ int sd_bus_open_system(sd_bus **ret) {
1198 assert_return(ret, -EINVAL);
1204 r = bus_set_address_system(b);
1208 b->bus_client = true;
1209 b->is_system = true;
1211 /* Let's do per-method access control on the system bus. We
1212 * need the caller's UID and capability set for that. */
1214 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1215 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1217 r = sd_bus_start(b);
1229 int bus_set_address_user(sd_bus *b) {
1234 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1236 return sd_bus_set_address(b, e);
1238 e = secure_getenv("XDG_RUNTIME_DIR");
1240 _cleanup_free_ char *ee = NULL;
1242 ee = bus_address_escape(e);
1246 (void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT ";" UNIX_USER_BUS_ADDRESS_FMT, getuid(), ee);
1248 (void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT, getuid());
1256 _public_ int sd_bus_open_user(sd_bus **ret) {
1260 assert_return(ret, -EINVAL);
1266 r = bus_set_address_user(b);
1270 b->bus_client = true;
1273 /* We don't do any per-method access control on the user
1277 r = sd_bus_start(b);
1289 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1290 _cleanup_free_ char *e = NULL;
1291 char *m = NULL, *c = NULL;
1296 /* Let's see if we shall enter some container */
1297 m = strchr(host, ':');
1301 /* Let's make sure this is not a port of some kind,
1302 * and is a valid machine name. */
1303 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1306 /* Cut out the host part */
1307 t = strndupa(host, m - host - 1);
1308 e = bus_address_escape(t);
1312 c = strjoina(",argv4=--machine=", m);
1317 e = bus_address_escape(host);
1322 b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e, ",argv3=systemd-stdio-bridge", c, NULL);
1329 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1333 assert_return(host, -EINVAL);
1334 assert_return(ret, -EINVAL);
1336 r = sd_bus_new(&bus);
1340 r = bus_set_address_system_remote(bus, host);
1344 bus->bus_client = true;
1345 bus->trusted = false;
1346 bus->is_system = true;
1348 r = sd_bus_start(bus);
1360 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1361 _cleanup_free_ char *e = NULL;
1366 e = bus_address_escape(machine);
1370 b->address = strjoin("x-machine-kernel:machine=", e, ";x-machine-unix:machine=", e, NULL);
1377 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1381 assert_return(machine, -EINVAL);
1382 assert_return(ret, -EINVAL);
1383 assert_return(machine_name_is_valid(machine), -EINVAL);
1385 r = sd_bus_new(&bus);
1389 r = bus_set_address_system_machine(bus, machine);
1393 bus->bus_client = true;
1394 bus->trusted = false;
1395 bus->is_system = true;
1397 r = sd_bus_start(bus);
1409 _public_ void sd_bus_close(sd_bus *bus) {
1413 if (bus->state == BUS_CLOSED)
1415 if (bus_pid_changed(bus))
1418 bus->state = BUS_CLOSED;
1420 sd_bus_detach_event(bus);
1422 /* Drop all queued messages so that they drop references to
1423 * the bus object and the bus may be freed */
1424 bus_reset_queues(bus);
1426 if (!bus->is_kernel)
1429 /* We'll leave the fd open in case this is a kernel bus, since
1430 * there might still be memblocks around that reference this
1431 * bus, and they might need to invoke the KDBUS_CMD_FREE
1432 * ioctl on the fd when they are freed. */
1435 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1443 return sd_bus_unref(bus);
1446 static void bus_enter_closing(sd_bus *bus) {
1449 if (bus->state != BUS_OPENING &&
1450 bus->state != BUS_AUTHENTICATING &&
1451 bus->state != BUS_HELLO &&
1452 bus->state != BUS_RUNNING)
1455 bus->state = BUS_CLOSING;
1458 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1459 assert_return(bus, NULL);
1461 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1466 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1472 i = REFCNT_DEC(bus->n_ref);
1480 /// UNNEEDED by elogind
1482 _public_ int sd_bus_is_open(sd_bus *bus) {
1484 assert_return(bus, -EINVAL);
1485 assert_return(!bus_pid_changed(bus), -ECHILD);
1487 return BUS_IS_OPEN(bus->state);
1491 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1494 assert_return(bus, -EINVAL);
1495 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1496 assert_return(!bus_pid_changed(bus), -ECHILD);
1498 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
1501 if (type == SD_BUS_TYPE_UNIX_FD) {
1502 if (!(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD))
1505 r = bus_ensure_running(bus);
1509 return bus->can_fds;
1512 return bus_type_is_valid(type);
1515 /// UNNEEDED by elogind
1517 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1520 assert_return(bus, -EINVAL);
1521 assert_return(id, -EINVAL);
1522 assert_return(!bus_pid_changed(bus), -ECHILD);
1524 r = bus_ensure_running(bus);
1528 *id = bus->server_id;
1533 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1538 /* If we copy the same message to multiple
1539 * destinations, avoid using the same cookie
1541 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1546 timeout = BUS_DEFAULT_TIMEOUT;
1548 return bus_message_seal(m, ++b->cookie, timeout);
1551 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1552 bool remarshal = false;
1556 /* wrong packet version */
1557 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1560 /* wrong packet endianness */
1561 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1564 /* TODO: kdbus-messages received from the kernel contain data which is
1565 * not allowed to be passed to KDBUS_CMD_SEND. Therefore, we have to
1566 * force remarshaling of the message. Technically, we could just
1567 * recreate the kdbus message, but that is non-trivial as other parts of
1568 * the message refer to m->kdbus already. This should be fixed! */
1569 if ((*m)->kdbus && (*m)->release_kdbus)
1572 return remarshal ? bus_message_remarshal(b, m) : 0;
1575 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1579 /* Fake some timestamps, if they were requested, and not
1580 * already initialized */
1581 if (b->attach_flags & KDBUS_ATTACH_TIMESTAMP) {
1582 if (m->realtime <= 0)
1583 m->realtime = now(CLOCK_REALTIME);
1585 if (m->monotonic <= 0)
1586 m->monotonic = now(CLOCK_MONOTONIC);
1589 /* The bus specification says the serial number cannot be 0,
1590 * hence let's fill something in for synthetic messages. Since
1591 * synthetic messages might have a fake sender and we don't
1592 * want to interfere with the real sender's serial numbers we
1593 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1594 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1595 * even though kdbus can do 64bit. */
1596 return bus_message_seal(m, 0xFFFFFFFFULL, 0);
1599 static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
1606 r = bus_kernel_write_message(bus, m, hint_sync_call);
1608 r = bus_socket_write_message(bus, m, idx);
1613 if (bus->is_kernel || *idx >= BUS_MESSAGE_SIZE(m))
1614 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
1615 bus_message_type_to_string(m->header->type),
1616 strna(sd_bus_message_get_sender(m)),
1617 strna(sd_bus_message_get_destination(m)),
1618 strna(sd_bus_message_get_path(m)),
1619 strna(sd_bus_message_get_interface(m)),
1620 strna(sd_bus_message_get_member(m)),
1621 BUS_MESSAGE_COOKIE(m),
1623 strna(m->error.message));
1628 static int dispatch_wqueue(sd_bus *bus) {
1632 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1634 while (bus->wqueue_size > 0) {
1636 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
1640 /* Didn't do anything this time */
1642 else if (bus->is_kernel || bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1643 /* Fully written. Let's drop the entry from
1646 * This isn't particularly optimized, but
1647 * well, this is supposed to be our worst-case
1648 * buffer only, and the socket buffer is
1649 * supposed to be our primary buffer, and if
1650 * it got full, then all bets are off
1653 bus->wqueue_size --;
1654 sd_bus_message_unref(bus->wqueue[0]);
1655 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1665 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1669 return bus_kernel_read_message(bus, hint_priority, priority);
1671 return bus_socket_read_message(bus);
1674 int bus_rqueue_make_room(sd_bus *bus) {
1677 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1680 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1686 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1691 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1693 /* Note that the priority logic is only available on kdbus,
1694 * where the rqueue is unused. We check the rqueue here
1695 * anyway, because it's simple... */
1698 if (bus->rqueue_size > 0) {
1699 /* Dispatch a queued message */
1701 *m = bus->rqueue[0];
1702 bus->rqueue_size --;
1703 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1707 /* Try to read a new message */
1708 r = bus_read_message(bus, hint_priority, priority);
1718 static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
1719 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1722 assert_return(m, -EINVAL);
1727 assert_return(!bus_pid_changed(bus), -ECHILD);
1728 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1730 if (!BUS_IS_OPEN(bus->state))
1734 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1741 /* If the cookie number isn't kept, then we know that no reply
1743 if (!cookie && !m->sealed)
1744 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1746 r = bus_seal_message(bus, m, 0);
1750 /* Remarshall if we have to. This will possibly unref the
1751 * message and place a replacement in m */
1752 r = bus_remarshal_message(bus, &m);
1756 /* If this is a reply and no reply was requested, then let's
1757 * suppress this, if we can */
1761 if ((bus->state == BUS_RUNNING || bus->state == BUS_HELLO) && bus->wqueue_size <= 0) {
1764 r = bus_write_message(bus, m, hint_sync_call, &idx);
1766 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1767 bus_enter_closing(bus);
1774 if (!bus->is_kernel && idx < BUS_MESSAGE_SIZE(m)) {
1775 /* Wasn't fully written. So let's remember how
1776 * much was written. Note that the first entry
1777 * of the wqueue array is always allocated so
1778 * that we always can remember how much was
1780 bus->wqueue[0] = sd_bus_message_ref(m);
1781 bus->wqueue_size = 1;
1786 /* Just append it to the queue. */
1788 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1791 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1794 bus->wqueue[bus->wqueue_size ++] = sd_bus_message_ref(m);
1799 *cookie = BUS_MESSAGE_COOKIE(m);
1804 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1805 return bus_send_internal(bus, m, cookie, false);
1808 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1811 assert_return(m, -EINVAL);
1816 assert_return(!bus_pid_changed(bus), -ECHILD);
1818 if (!BUS_IS_OPEN(bus->state))
1821 if (!streq_ptr(m->destination, destination)) {
1826 r = sd_bus_message_set_destination(m, destination);
1831 return sd_bus_send(bus, m, cookie);
1834 static usec_t calc_elapse(uint64_t usec) {
1835 if (usec == (uint64_t) -1)
1838 return now(CLOCK_MONOTONIC) + usec;
1841 static int timeout_compare(const void *a, const void *b) {
1842 const struct reply_callback *x = a, *y = b;
1844 if (x->timeout != 0 && y->timeout == 0)
1847 if (x->timeout == 0 && y->timeout != 0)
1850 if (x->timeout < y->timeout)
1853 if (x->timeout > y->timeout)
1859 _public_ int sd_bus_call_async(
1863 sd_bus_message_handler_t callback,
1867 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1868 _cleanup_bus_slot_unref_ sd_bus_slot *s = NULL;
1871 assert_return(m, -EINVAL);
1872 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1873 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1874 assert_return(callback, -EINVAL);
1879 assert_return(!bus_pid_changed(bus), -ECHILD);
1880 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1882 if (!BUS_IS_OPEN(bus->state))
1885 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
1889 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1893 r = bus_seal_message(bus, m, usec);
1897 r = bus_remarshal_message(bus, &m);
1901 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
1905 s->reply_callback.callback = callback;
1907 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
1908 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
1910 s->reply_callback.cookie = 0;
1914 s->reply_callback.timeout = calc_elapse(m->timeout);
1915 if (s->reply_callback.timeout != 0) {
1916 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
1918 s->reply_callback.timeout = 0;
1923 r = sd_bus_send(bus, m, &s->reply_callback.cookie);
1934 int bus_ensure_running(sd_bus *bus) {
1939 if (bus->state == BUS_UNSET || bus->state == BUS_CLOSED || bus->state == BUS_CLOSING)
1941 if (bus->state == BUS_RUNNING)
1945 r = sd_bus_process(bus, NULL);
1948 if (bus->state == BUS_RUNNING)
1953 r = sd_bus_wait(bus, (uint64_t) -1);
1959 _public_ int sd_bus_call(
1963 sd_bus_error *error,
1964 sd_bus_message **reply) {
1966 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1972 assert_return(m, -EINVAL);
1973 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1974 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1975 assert_return(!bus_error_is_dirty(error), -EINVAL);
1980 assert_return(!bus_pid_changed(bus), -ECHILD);
1981 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1983 if (!BUS_IS_OPEN(bus->state))
1986 r = bus_ensure_running(bus);
1990 i = bus->rqueue_size;
1992 r = bus_seal_message(bus, m, usec);
1996 r = bus_remarshal_message(bus, &m);
2000 r = bus_send_internal(bus, m, &cookie, true);
2004 timeout = calc_elapse(m->timeout);
2009 while (i < bus->rqueue_size) {
2010 sd_bus_message *incoming = NULL;
2012 incoming = bus->rqueue[i];
2014 if (incoming->reply_cookie == cookie) {
2015 /* Found a match! */
2017 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2019 log_debug_bus_message(incoming);
2021 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2023 if (incoming->n_fds <= 0 || (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2027 sd_bus_message_unref(incoming);
2032 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2034 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR)
2035 r = sd_bus_error_copy(error, &incoming->error);
2039 sd_bus_message_unref(incoming);
2042 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2045 streq(bus->unique_name, incoming->sender)) {
2047 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2050 /* Our own message? Somebody is trying
2051 * to send its own client a message,
2052 * let's not dead-lock, let's fail
2055 sd_bus_message_unref(incoming);
2059 /* Try to read more, right-away */
2063 r = bus_read_message(bus, false, 0);
2065 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2066 bus_enter_closing(bus);
2078 n = now(CLOCK_MONOTONIC);
2084 left = (uint64_t) -1;
2086 r = bus_poll(bus, true, left);
2092 r = dispatch_wqueue(bus);
2094 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2095 bus_enter_closing(bus);
2104 _public_ int sd_bus_get_fd(sd_bus *bus) {
2106 assert_return(bus, -EINVAL);
2107 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2108 assert_return(!bus_pid_changed(bus), -ECHILD);
2110 return bus->input_fd;
2113 _public_ int sd_bus_get_events(sd_bus *bus) {
2116 assert_return(bus, -EINVAL);
2117 assert_return(!bus_pid_changed(bus), -ECHILD);
2119 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2122 if (bus->state == BUS_OPENING)
2124 else if (bus->state == BUS_AUTHENTICATING) {
2126 if (bus_socket_auth_needs_write(bus))
2131 } else if (bus->state == BUS_RUNNING || bus->state == BUS_HELLO) {
2132 if (bus->rqueue_size <= 0)
2134 if (bus->wqueue_size > 0)
2141 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2142 struct reply_callback *c;
2144 assert_return(bus, -EINVAL);
2145 assert_return(timeout_usec, -EINVAL);
2146 assert_return(!bus_pid_changed(bus), -ECHILD);
2148 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2151 if (bus->track_queue) {
2156 if (bus->state == BUS_CLOSING) {
2161 if (bus->state == BUS_AUTHENTICATING) {
2162 *timeout_usec = bus->auth_timeout;
2166 if (bus->state != BUS_RUNNING && bus->state != BUS_HELLO) {
2167 *timeout_usec = (uint64_t) -1;
2171 if (bus->rqueue_size > 0) {
2176 c = prioq_peek(bus->reply_callbacks_prioq);
2178 *timeout_usec = (uint64_t) -1;
2182 if (c->timeout == 0) {
2183 *timeout_usec = (uint64_t) -1;
2187 *timeout_usec = c->timeout;
2191 static int process_timeout(sd_bus *bus) {
2192 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2193 _cleanup_bus_message_unref_ sd_bus_message* m = NULL;
2194 struct reply_callback *c;
2201 c = prioq_peek(bus->reply_callbacks_prioq);
2205 n = now(CLOCK_MONOTONIC);
2209 r = bus_message_new_synthetic_error(
2212 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2217 r = bus_seal_synthetic_message(bus, m);
2221 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2224 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2227 slot = container_of(c, sd_bus_slot, reply_callback);
2229 bus->iteration_counter ++;
2231 bus->current_message = m;
2232 bus->current_slot = sd_bus_slot_ref(slot);
2233 bus->current_handler = c->callback;
2234 bus->current_userdata = slot->userdata;
2235 r = c->callback(m, slot->userdata, &error_buffer);
2236 bus->current_userdata = NULL;
2237 bus->current_handler = NULL;
2238 bus->current_slot = NULL;
2239 bus->current_message = NULL;
2241 if (slot->floating) {
2242 bus_slot_disconnect(slot);
2243 sd_bus_slot_unref(slot);
2246 sd_bus_slot_unref(slot);
2248 return bus_maybe_reply_error(m, r, &error_buffer);
2251 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2255 if (bus->state != BUS_HELLO)
2258 /* Let's make sure the first message on the bus is the HELLO
2259 * reply. But note that we don't actually parse the message
2260 * here (we leave that to the usual handling), we just verify
2261 * we don't let any earlier msg through. */
2263 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2264 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2267 if (m->reply_cookie != 1)
2273 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2274 _cleanup_bus_message_unref_ sd_bus_message *synthetic_reply = NULL;
2275 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2276 struct reply_callback *c;
2283 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2284 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2287 if (bus->is_kernel && (bus->hello_flags & KDBUS_HELLO_MONITOR))
2290 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2293 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2299 slot = container_of(c, sd_bus_slot, reply_callback);
2301 if (m->n_fds > 0 && !(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2303 /* If the reply contained a file descriptor which we
2304 * didn't want we pass an error instead. */
2306 r = bus_message_new_synthetic_error(
2309 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2314 /* Copy over original timestamp */
2315 synthetic_reply->realtime = m->realtime;
2316 synthetic_reply->monotonic = m->monotonic;
2317 synthetic_reply->seqnum = m->seqnum;
2319 r = bus_seal_synthetic_message(bus, synthetic_reply);
2323 m = synthetic_reply;
2325 r = sd_bus_message_rewind(m, true);
2330 if (c->timeout != 0) {
2331 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2335 bus->current_slot = sd_bus_slot_ref(slot);
2336 bus->current_handler = c->callback;
2337 bus->current_userdata = slot->userdata;
2338 r = c->callback(m, slot->userdata, &error_buffer);
2339 bus->current_userdata = NULL;
2340 bus->current_handler = NULL;
2341 bus->current_slot = NULL;
2343 if (slot->floating) {
2344 bus_slot_disconnect(slot);
2345 sd_bus_slot_unref(slot);
2348 sd_bus_slot_unref(slot);
2350 return bus_maybe_reply_error(m, r, &error_buffer);
2353 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2354 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2355 struct filter_callback *l;
2362 bus->filter_callbacks_modified = false;
2364 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2367 if (bus->filter_callbacks_modified)
2370 /* Don't run this more than once per iteration */
2371 if (l->last_iteration == bus->iteration_counter)
2374 l->last_iteration = bus->iteration_counter;
2376 r = sd_bus_message_rewind(m, true);
2380 slot = container_of(l, sd_bus_slot, filter_callback);
2382 bus->current_slot = sd_bus_slot_ref(slot);
2383 bus->current_handler = l->callback;
2384 bus->current_userdata = slot->userdata;
2385 r = l->callback(m, slot->userdata, &error_buffer);
2386 bus->current_userdata = NULL;
2387 bus->current_handler = NULL;
2388 bus->current_slot = sd_bus_slot_unref(slot);
2390 r = bus_maybe_reply_error(m, r, &error_buffer);
2396 } while (bus->filter_callbacks_modified);
2401 static int process_match(sd_bus *bus, sd_bus_message *m) {
2408 bus->match_callbacks_modified = false;
2410 r = bus_match_run(bus, &bus->match_callbacks, m);
2414 } while (bus->match_callbacks_modified);
2419 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2420 _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
2426 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2429 if (bus->manual_peer_interface)
2432 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2435 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2438 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2441 if (streq_ptr(m->member, "Ping"))
2442 r = sd_bus_message_new_method_return(m, &reply);
2443 else if (streq_ptr(m->member, "GetMachineId")) {
2447 r = sd_id128_get_machine(&id);
2451 r = sd_bus_message_new_method_return(m, &reply);
2455 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2457 r = sd_bus_message_new_method_errorf(
2459 SD_BUS_ERROR_UNKNOWN_METHOD,
2460 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2466 r = sd_bus_send(bus, reply, NULL);
2473 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2477 /* If we got a message with a file descriptor which we didn't
2478 * want to accept, then let's drop it. How can this even
2479 * happen? For example, when the kernel queues a message into
2480 * an activatable names's queue which allows fds, and then is
2481 * delivered to us later even though we ourselves did not
2484 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2490 if (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)
2493 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2494 return 1; /* just eat it up */
2496 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2499 static int process_message(sd_bus *bus, sd_bus_message *m) {
2505 bus->current_message = m;
2506 bus->iteration_counter++;
2508 log_debug_bus_message(m);
2510 r = process_hello(bus, m);
2514 r = process_reply(bus, m);
2518 r = process_fd_check(bus, m);
2522 r = process_filter(bus, m);
2526 r = process_match(bus, m);
2530 r = process_builtin(bus, m);
2534 r = bus_process_object(bus, m);
2537 bus->current_message = NULL;
2541 static int dispatch_track(sd_bus *bus) {
2544 if (!bus->track_queue)
2547 bus_track_dispatch(bus->track_queue);
2551 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2552 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2556 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
2558 r = process_timeout(bus);
2562 r = dispatch_wqueue(bus);
2566 r = dispatch_track(bus);
2570 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2576 r = process_message(bus, m);
2581 r = sd_bus_message_rewind(m, true);
2590 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2592 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2593 strna(sd_bus_message_get_sender(m)),
2594 strna(sd_bus_message_get_path(m)),
2595 strna(sd_bus_message_get_interface(m)),
2596 strna(sd_bus_message_get_member(m)));
2598 r = sd_bus_reply_method_errorf(
2600 SD_BUS_ERROR_UNKNOWN_OBJECT,
2601 "Unknown object '%s'.", m->path);
2615 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2616 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2617 struct reply_callback *c;
2621 assert(bus->state == BUS_CLOSING);
2623 c = ordered_hashmap_first(bus->reply_callbacks);
2625 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2628 /* First, fail all outstanding method calls */
2629 r = bus_message_new_synthetic_error(
2632 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2637 r = bus_seal_synthetic_message(bus, m);
2641 if (c->timeout != 0) {
2642 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2646 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2649 slot = container_of(c, sd_bus_slot, reply_callback);
2651 bus->iteration_counter++;
2653 bus->current_message = m;
2654 bus->current_slot = sd_bus_slot_ref(slot);
2655 bus->current_handler = c->callback;
2656 bus->current_userdata = slot->userdata;
2657 r = c->callback(m, slot->userdata, &error_buffer);
2658 bus->current_userdata = NULL;
2659 bus->current_handler = NULL;
2660 bus->current_slot = NULL;
2661 bus->current_message = NULL;
2663 if (slot->floating) {
2664 bus_slot_disconnect(slot);
2665 sd_bus_slot_unref(slot);
2668 sd_bus_slot_unref(slot);
2670 return bus_maybe_reply_error(m, r, &error_buffer);
2673 /* Then, synthesize a Disconnected message */
2674 r = sd_bus_message_new_signal(
2677 "/org/freedesktop/DBus/Local",
2678 "org.freedesktop.DBus.Local",
2683 bus_message_set_sender_local(bus, m);
2685 r = bus_seal_synthetic_message(bus, m);
2691 bus->current_message = m;
2692 bus->iteration_counter++;
2694 r = process_filter(bus, m);
2698 r = process_match(bus, m);
2710 bus->current_message = NULL;
2715 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2716 BUS_DONT_DESTROY(bus);
2719 /* Returns 0 when we didn't do anything. This should cause the
2720 * caller to invoke sd_bus_wait() before returning the next
2721 * time. Returns > 0 when we did something, which possibly
2722 * means *ret is filled in with an unprocessed message. */
2724 assert_return(bus, -EINVAL);
2725 assert_return(!bus_pid_changed(bus), -ECHILD);
2727 /* We don't allow recursively invoking sd_bus_process(). */
2728 assert_return(!bus->current_message, -EBUSY);
2729 assert(!bus->current_slot);
2731 switch (bus->state) {
2740 r = bus_socket_process_opening(bus);
2741 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2742 bus_enter_closing(bus);
2750 case BUS_AUTHENTICATING:
2751 r = bus_socket_process_authenticating(bus);
2752 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2753 bus_enter_closing(bus);
2765 r = process_running(bus, hint_priority, priority, ret);
2766 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2767 bus_enter_closing(bus);
2777 return process_closing(bus, ret);
2780 assert_not_reached("Unknown state");
2783 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2784 return bus_process_internal(bus, false, 0, ret);
2787 /// UNNEEDED by elogind
2789 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2790 return bus_process_internal(bus, true, priority, ret);
2794 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2795 struct pollfd p[2] = {};
2798 usec_t m = USEC_INFINITY;
2802 if (bus->state == BUS_CLOSING)
2805 if (!BUS_IS_OPEN(bus->state))
2808 e = sd_bus_get_events(bus);
2813 /* The caller really needs some more data, he doesn't
2814 * care about what's already read, or any timeouts
2815 * except its own. */
2819 /* The caller wants to process if there's something to
2820 * process, but doesn't care otherwise */
2822 r = sd_bus_get_timeout(bus, &until);
2827 nw = now(CLOCK_MONOTONIC);
2828 m = until > nw ? until - nw : 0;
2832 if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
2835 p[0].fd = bus->input_fd;
2836 if (bus->output_fd == bus->input_fd) {
2840 p[0].events = e & POLLIN;
2841 p[1].fd = bus->output_fd;
2842 p[1].events = e & POLLOUT;
2846 r = ppoll(p, n, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
2850 return r > 0 ? 1 : 0;
2853 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2855 assert_return(bus, -EINVAL);
2856 assert_return(!bus_pid_changed(bus), -ECHILD);
2858 if (bus->state == BUS_CLOSING)
2861 if (!BUS_IS_OPEN(bus->state))
2864 if (bus->rqueue_size > 0)
2867 return bus_poll(bus, false, timeout_usec);
2870 _public_ int sd_bus_flush(sd_bus *bus) {
2873 assert_return(bus, -EINVAL);
2874 assert_return(!bus_pid_changed(bus), -ECHILD);
2876 if (bus->state == BUS_CLOSING)
2879 if (!BUS_IS_OPEN(bus->state))
2882 r = bus_ensure_running(bus);
2886 if (bus->wqueue_size <= 0)
2890 r = dispatch_wqueue(bus);
2892 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2893 bus_enter_closing(bus);
2900 if (bus->wqueue_size <= 0)
2903 r = bus_poll(bus, false, (uint64_t) -1);
2909 _public_ int sd_bus_add_filter(
2912 sd_bus_message_handler_t callback,
2917 assert_return(bus, -EINVAL);
2918 assert_return(callback, -EINVAL);
2919 assert_return(!bus_pid_changed(bus), -ECHILD);
2921 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
2925 s->filter_callback.callback = callback;
2927 bus->filter_callbacks_modified = true;
2928 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
2936 _public_ int sd_bus_add_match(
2940 sd_bus_message_handler_t callback,
2943 struct bus_match_component *components = NULL;
2944 unsigned n_components = 0;
2945 sd_bus_slot *s = NULL;
2948 assert_return(bus, -EINVAL);
2949 assert_return(match, -EINVAL);
2950 assert_return(!bus_pid_changed(bus), -ECHILD);
2952 r = bus_match_parse(match, &components, &n_components);
2956 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
2962 s->match_callback.callback = callback;
2963 s->match_callback.cookie = ++bus->match_cookie;
2965 if (bus->bus_client) {
2966 enum bus_match_scope scope;
2968 scope = bus_match_get_scope(components, n_components);
2970 /* Do not install server-side matches for matches
2971 * against the local service, interface or bus
2973 if (scope != BUS_MATCH_LOCAL) {
2975 if (!bus->is_kernel) {
2976 /* When this is not a kernel transport, we
2977 * store the original match string, so that we
2978 * can use it to remove the match again */
2980 s->match_callback.match_string = strdup(match);
2981 if (!s->match_callback.match_string) {
2987 r = bus_add_match_internal(bus, s->match_callback.match_string, components, n_components, s->match_callback.cookie);
2991 s->match_added = true;
2995 bus->match_callbacks_modified = true;
2996 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3005 bus_match_parse_free(components, n_components);
3006 sd_bus_slot_unref(s);
3011 /// UNNEEDED by elogind
3013 int bus_remove_match_by_string(
3016 sd_bus_message_handler_t callback,
3019 struct bus_match_component *components = NULL;
3020 unsigned n_components = 0;
3021 struct match_callback *c;
3024 assert_return(bus, -EINVAL);
3025 assert_return(match, -EINVAL);
3026 assert_return(!bus_pid_changed(bus), -ECHILD);
3028 r = bus_match_parse(match, &components, &n_components);
3032 r = bus_match_find(&bus->match_callbacks, components, n_components, NULL, NULL, &c);
3036 sd_bus_slot_unref(container_of(c, sd_bus_slot, match_callback));
3039 bus_match_parse_free(components, n_components);
3045 bool bus_pid_changed(sd_bus *bus) {
3048 /* We don't support people creating a bus connection and
3049 * keeping it around over a fork(). Let's complain. */
3051 return bus->original_pid != getpid();
3054 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3055 sd_bus *bus = userdata;
3060 r = sd_bus_process(bus, NULL);
3067 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3068 sd_bus *bus = userdata;
3073 r = sd_bus_process(bus, NULL);
3080 static int prepare_callback(sd_event_source *s, void *userdata) {
3081 sd_bus *bus = userdata;
3088 e = sd_bus_get_events(bus);
3092 if (bus->output_fd != bus->input_fd) {
3094 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3098 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3102 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3107 r = sd_bus_get_timeout(bus, &until);
3113 j = sd_event_source_set_time(bus->time_event_source, until);
3118 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3125 static int quit_callback(sd_event_source *event, void *userdata) {
3126 sd_bus *bus = userdata;
3136 static int attach_io_events(sd_bus *bus) {
3141 if (bus->input_fd < 0)
3147 if (!bus->input_io_event_source) {
3148 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3152 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3156 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3160 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3162 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3167 if (bus->output_fd != bus->input_fd) {
3168 assert(bus->output_fd >= 0);
3170 if (!bus->output_io_event_source) {
3171 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3175 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3179 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3181 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3190 static void detach_io_events(sd_bus *bus) {
3193 if (bus->input_io_event_source) {
3194 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3195 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3198 if (bus->output_io_event_source) {
3199 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3200 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3204 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3207 assert_return(bus, -EINVAL);
3208 assert_return(!bus->event, -EBUSY);
3210 assert(!bus->input_io_event_source);
3211 assert(!bus->output_io_event_source);
3212 assert(!bus->time_event_source);
3215 bus->event = sd_event_ref(event);
3217 r = sd_event_default(&bus->event);
3222 bus->event_priority = priority;
3224 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3228 r = sd_event_source_set_priority(bus->time_event_source, priority);
3232 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3236 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3240 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3244 r = attach_io_events(bus);
3251 sd_bus_detach_event(bus);
3255 _public_ int sd_bus_detach_event(sd_bus *bus) {
3256 assert_return(bus, -EINVAL);
3261 detach_io_events(bus);
3263 if (bus->time_event_source) {
3264 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3265 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3268 if (bus->quit_event_source) {
3269 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3270 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3273 bus->event = sd_event_unref(bus->event);
3277 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3278 assert_return(bus, NULL);
3283 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3284 assert_return(bus, NULL);
3286 return bus->current_message;
3289 /// UNNEEDED by elogind
3291 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3292 assert_return(bus, NULL);
3294 return bus->current_slot;
3298 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3299 assert_return(bus, NULL);
3301 return bus->current_handler;
3304 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3305 assert_return(bus, NULL);
3307 return bus->current_userdata;
3310 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3315 assert(default_bus);
3318 return !!*default_bus;
3321 *ret = sd_bus_ref(*default_bus);
3329 b->default_bus_ptr = default_bus;
3337 _public_ int sd_bus_default_system(sd_bus **ret) {
3338 static thread_local sd_bus *default_system_bus = NULL;
3340 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3343 _public_ int sd_bus_default_user(sd_bus **ret) {
3344 static thread_local sd_bus *default_user_bus = NULL;
3346 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3349 _public_ int sd_bus_default(sd_bus **ret) {
3353 /* Let's try our best to reuse another cached connection. If
3354 * the starter bus type is set, connect via our normal
3355 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3356 * we can share the connection with the user/system default
3359 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3361 if (streq(e, "system"))
3362 return sd_bus_default_system(ret);
3363 else if (STR_IN_SET(e, "user", "session"))
3364 return sd_bus_default_user(ret);
3367 /* No type is specified, so we have not other option than to
3368 * use the starter address if it is set. */
3370 e = secure_getenv("DBUS_STARTER_ADDRESS");
3372 static thread_local sd_bus *default_starter_bus = NULL;
3374 return bus_default(sd_bus_open, &default_starter_bus, ret);
3377 /* Finally, if nothing is set use the cached connection for
3378 * the right scope */
3380 return sd_bus_default_system(ret);
3383 /// UNNEEDED by elogind
3385 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3386 assert_return(b, -EINVAL);
3387 assert_return(tid, -EINVAL);
3388 assert_return(!bus_pid_changed(b), -ECHILD);
3396 return sd_event_get_tid(b->event, tid);
3401 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3402 _cleanup_free_ char *e = NULL;
3405 assert_return(object_path_is_valid(prefix), -EINVAL);
3406 assert_return(external_id, -EINVAL);
3407 assert_return(ret_path, -EINVAL);
3409 e = bus_label_escape(external_id);
3413 ret = strjoin(prefix, "/", e, NULL);
3421 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3425 assert_return(object_path_is_valid(path), -EINVAL);
3426 assert_return(object_path_is_valid(prefix), -EINVAL);
3427 assert_return(external_id, -EINVAL);
3429 e = object_path_startswith(path, prefix);
3431 *external_id = NULL;
3435 ret = bus_label_unescape(e);
3444 _public_ int sd_bus_try_close(sd_bus *bus) {
3447 assert_return(bus, -EINVAL);
3448 assert_return(!bus_pid_changed(bus), -ECHILD);
3450 if (!bus->is_kernel)
3453 if (!BUS_IS_OPEN(bus->state))
3456 if (bus->rqueue_size > 0)
3459 if (bus->wqueue_size > 0)
3462 r = bus_kernel_try_close(bus);
3470 /// UNNEEDED by elogind
3472 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3473 assert_return(bus, -EINVAL);
3474 assert_return(description, -EINVAL);
3475 assert_return(bus->description, -ENXIO);
3476 assert_return(!bus_pid_changed(bus), -ECHILD);
3478 *description = bus->description;
3483 int bus_get_root_path(sd_bus *bus) {
3486 if (bus->cgroup_root)
3489 r = cg_get_root_path(&bus->cgroup_root);
3491 bus->cgroup_root = strdup("/");
3492 if (!bus->cgroup_root)
3501 /// UNNEEDED by elogind
3503 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3506 assert_return(bus, -EINVAL);
3507 assert_return(scope, -EINVAL);
3508 assert_return(!bus_pid_changed(bus), -ECHILD);
3510 if (bus->is_kernel) {
3511 _cleanup_free_ char *n = NULL;
3514 r = bus_kernel_get_bus_name(bus, &n);
3518 if (streq(n, "0-system")) {
3523 dash = strchr(n, '-');
3524 if (streq_ptr(dash, "-user")) {
3535 if (bus->is_system) {
3543 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3545 assert_return(bus, -EINVAL);
3546 assert_return(address, -EINVAL);
3547 assert_return(!bus_pid_changed(bus), -ECHILD);
3550 *address = bus->address;
3557 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
3558 assert_return(bus, -EINVAL);
3559 assert_return(mask, -EINVAL);
3560 assert_return(!bus_pid_changed(bus), -ECHILD);
3562 *mask = bus->creds_mask;
3566 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
3567 assert_return(bus, -EINVAL);
3568 assert_return(!bus_pid_changed(bus), -ECHILD);
3570 return bus->bus_client;
3573 _public_ int sd_bus_is_server(sd_bus *bus) {
3574 assert_return(bus, -EINVAL);
3575 assert_return(!bus_pid_changed(bus), -ECHILD);
3577 return bus->is_server;
3580 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
3581 assert_return(bus, -EINVAL);
3582 assert_return(!bus_pid_changed(bus), -ECHILD);
3584 return bus->anonymous_auth;
3587 _public_ int sd_bus_is_trusted(sd_bus *bus) {
3588 assert_return(bus, -EINVAL);
3589 assert_return(!bus_pid_changed(bus), -ECHILD);
3591 return bus->trusted;
3594 _public_ int sd_bus_is_monitor(sd_bus *bus) {
3595 assert_return(bus, -EINVAL);
3596 assert_return(!bus_pid_changed(bus), -ECHILD);
3598 return !!(bus->hello_flags & KDBUS_HELLO_MONITOR);