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) {
77 safe_close(b->input_fd);
79 if (b->output_fd >= 0 && b->output_fd != b->input_fd)
80 safe_close(b->output_fd);
82 b->input_fd = b->output_fd = -1;
85 static void bus_reset_queues(sd_bus *b) {
88 while (b->rqueue_size > 0)
89 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
93 b->rqueue_allocated = 0;
95 while (b->wqueue_size > 0)
96 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
100 b->wqueue_allocated = 0;
103 static void bus_free(sd_bus *b) {
107 assert(!b->track_queue);
109 b->state = BUS_CLOSED;
111 sd_bus_detach_event(b);
113 while ((s = b->slots)) {
114 /* At this point only floating slots can still be
115 * around, because the non-floating ones keep a
116 * reference to the bus, and we thus couldn't be
117 * destructing right now... We forcibly disconnect the
118 * slots here, so that they still can be referenced by
119 * apps, but are dead. */
122 bus_slot_disconnect(s);
123 sd_bus_slot_unref(s);
126 if (b->default_bus_ptr)
127 *b->default_bus_ptr = NULL;
132 munmap(b->kdbus_buffer, KDBUS_POOL_SIZE);
136 free(b->unique_name);
137 free(b->auth_buffer);
142 free(b->cgroup_root);
143 free(b->description);
146 strv_free(b->exec_argv);
148 close_many(b->fds, b->n_fds);
153 ordered_hashmap_free_free(b->reply_callbacks);
154 prioq_free(b->reply_callbacks_prioq);
156 assert(b->match_callbacks.type == BUS_MATCH_ROOT);
157 bus_match_free(&b->match_callbacks);
159 hashmap_free_free(b->vtable_methods);
160 hashmap_free_free(b->vtable_properties);
162 assert(hashmap_isempty(b->nodes));
163 hashmap_free(b->nodes);
165 bus_kernel_flush_memfd(b);
167 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
172 _public_ int sd_bus_new(sd_bus **ret) {
175 assert_return(ret, -EINVAL);
181 r->n_ref = REFCNT_INIT;
182 r->input_fd = r->output_fd = -1;
183 r->message_version = 1;
184 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
185 r->hello_flags |= KDBUS_HELLO_ACCEPT_FD;
186 r->attach_flags |= KDBUS_ATTACH_NAMES;
187 r->original_pid = getpid();
189 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
191 /* We guarantee that wqueue always has space for at least one
193 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
202 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
205 assert_return(bus, -EINVAL);
206 assert_return(bus->state == BUS_UNSET, -EPERM);
207 assert_return(address, -EINVAL);
208 assert_return(!bus_pid_changed(bus), -ECHILD);
220 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
221 assert_return(bus, -EINVAL);
222 assert_return(bus->state == BUS_UNSET, -EPERM);
223 assert_return(input_fd >= 0, -EINVAL);
224 assert_return(output_fd >= 0, -EINVAL);
225 assert_return(!bus_pid_changed(bus), -ECHILD);
227 bus->input_fd = input_fd;
228 bus->output_fd = output_fd;
232 /// UNNEEDED by elogind
234 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
237 assert_return(bus, -EINVAL);
238 assert_return(bus->state == BUS_UNSET, -EPERM);
239 assert_return(path, -EINVAL);
240 assert_return(!strv_isempty(argv), -EINVAL);
241 assert_return(!bus_pid_changed(bus), -ECHILD);
253 free(bus->exec_path);
254 strv_free(bus->exec_argv);
262 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
263 assert_return(bus, -EINVAL);
264 assert_return(bus->state == BUS_UNSET, -EPERM);
265 assert_return(!bus_pid_changed(bus), -ECHILD);
267 bus->bus_client = !!b;
271 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
272 assert_return(bus, -EINVAL);
273 assert_return(bus->state == BUS_UNSET, -EPERM);
274 assert_return(!bus_pid_changed(bus), -ECHILD);
276 SET_FLAG(bus->hello_flags, KDBUS_HELLO_MONITOR, b);
280 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
281 assert_return(bus, -EINVAL);
282 assert_return(bus->state == BUS_UNSET, -EPERM);
283 assert_return(!bus_pid_changed(bus), -ECHILD);
285 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ACCEPT_FD, b);
289 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
291 assert_return(bus, -EINVAL);
292 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
293 assert_return(!bus_pid_changed(bus), -ECHILD);
295 new_flags = bus->attach_flags;
296 SET_FLAG(new_flags, KDBUS_ATTACH_TIMESTAMP, b);
298 if (bus->attach_flags == new_flags)
301 bus->attach_flags = new_flags;
302 if (bus->state != BUS_UNSET && bus->is_kernel)
303 bus_kernel_realize_attach_flags(bus);
309 _public_ int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t mask) {
312 assert_return(bus, -EINVAL);
313 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
314 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
315 assert_return(!bus_pid_changed(bus), -ECHILD);
318 bus->creds_mask |= mask;
320 bus->creds_mask &= ~mask;
322 /* The well knowns we need unconditionally, so that matches can work */
323 bus->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
325 /* Make sure we don't lose the timestamp flag */
326 new_flags = (bus->attach_flags & KDBUS_ATTACH_TIMESTAMP) | attach_flags_to_kdbus(bus->creds_mask);
327 if (bus->attach_flags == new_flags)
330 bus->attach_flags = new_flags;
331 if (bus->state != BUS_UNSET && bus->is_kernel)
332 bus_kernel_realize_attach_flags(bus);
337 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
338 assert_return(bus, -EINVAL);
339 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
340 assert_return(bus->state == BUS_UNSET, -EPERM);
341 assert_return(!bus_pid_changed(bus), -ECHILD);
343 bus->is_server = !!b;
344 bus->server_id = server_id;
348 /// UNNEEDED by elogind
350 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
351 assert_return(bus, -EINVAL);
352 assert_return(bus->state == BUS_UNSET, -EPERM);
353 assert_return(!bus_pid_changed(bus), -ECHILD);
355 bus->anonymous_auth = !!b;
359 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
360 assert_return(bus, -EINVAL);
361 assert_return(bus->state == BUS_UNSET, -EPERM);
362 assert_return(!bus_pid_changed(bus), -ECHILD);
368 _public_ int sd_bus_set_description(sd_bus *bus, const char *description) {
369 assert_return(bus, -EINVAL);
370 assert_return(bus->state == BUS_UNSET, -EPERM);
371 assert_return(!bus_pid_changed(bus), -ECHILD);
373 return free_and_strdup(&bus->description, description);
377 _public_ int sd_bus_set_allow_interactive_authorization(sd_bus *bus, int b) {
378 assert_return(bus, -EINVAL);
379 assert_return(!bus_pid_changed(bus), -ECHILD);
381 bus->allow_interactive_authorization = !!b;
385 /// UNNEEDED by elogind
387 _public_ int sd_bus_get_allow_interactive_authorization(sd_bus *bus) {
388 assert_return(bus, -EINVAL);
389 assert_return(!bus_pid_changed(bus), -ECHILD);
391 return bus->allow_interactive_authorization;
395 static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) {
403 assert(bus->state == BUS_HELLO || bus->state == BUS_CLOSING);
405 r = sd_bus_message_get_errno(reply);
409 r = sd_bus_message_read(reply, "s", &s);
413 if (!service_name_is_valid(s) || s[0] != ':')
416 bus->unique_name = strdup(s);
417 if (!bus->unique_name)
420 if (bus->state == BUS_HELLO)
421 bus->state = BUS_RUNNING;
426 static int bus_send_hello(sd_bus *bus) {
427 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
432 if (!bus->bus_client || bus->is_kernel)
435 r = sd_bus_message_new_method_call(
438 "org.freedesktop.DBus",
439 "/org/freedesktop/DBus",
440 "org.freedesktop.DBus",
445 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
448 int bus_start_running(sd_bus *bus) {
451 if (bus->bus_client && !bus->is_kernel) {
452 bus->state = BUS_HELLO;
456 bus->state = BUS_RUNNING;
460 static int parse_address_key(const char **p, const char *key, char **value) {
461 size_t l, n = 0, allocated = 0;
471 if (strncmp(*p, key, l) != 0)
484 while (*a != ';' && *a != ',' && *a != 0) {
502 c = (char) ((x << 4) | y);
509 if (!GREEDY_REALLOC(r, allocated, n + 2))
533 static void skip_address_key(const char **p) {
537 *p += strcspn(*p, ",");
543 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
544 _cleanup_free_ char *path = NULL, *abstract = NULL;
553 while (**p != 0 && **p != ';') {
554 r = parse_address_key(p, "guid", guid);
560 r = parse_address_key(p, "path", &path);
566 r = parse_address_key(p, "abstract", &abstract);
575 if (!path && !abstract)
578 if (path && abstract)
583 if (l > sizeof(b->sockaddr.un.sun_path))
586 b->sockaddr.un.sun_family = AF_UNIX;
587 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
588 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
589 } else if (abstract) {
590 l = strlen(abstract);
591 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
594 b->sockaddr.un.sun_family = AF_UNIX;
595 b->sockaddr.un.sun_path[0] = 0;
596 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
597 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
603 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
604 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
606 struct addrinfo *result, hints = {
607 .ai_socktype = SOCK_STREAM,
608 .ai_flags = AI_ADDRCONFIG,
616 while (**p != 0 && **p != ';') {
617 r = parse_address_key(p, "guid", guid);
623 r = parse_address_key(p, "host", &host);
629 r = parse_address_key(p, "port", &port);
635 r = parse_address_key(p, "family", &family);
648 if (streq(family, "ipv4"))
649 hints.ai_family = AF_INET;
650 else if (streq(family, "ipv6"))
651 hints.ai_family = AF_INET6;
656 r = getaddrinfo(host, port, &hints, &result);
660 return -EADDRNOTAVAIL;
662 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
663 b->sockaddr_size = result->ai_addrlen;
665 freeaddrinfo(result);
670 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
672 unsigned n_argv = 0, j;
674 size_t allocated = 0;
682 while (**p != 0 && **p != ';') {
683 r = parse_address_key(p, "guid", guid);
689 r = parse_address_key(p, "path", &path);
695 if (startswith(*p, "argv")) {
699 ul = strtoul(*p + 4, (char**) p, 10);
700 if (errno > 0 || **p != '=' || ul > 256) {
708 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
716 r = parse_address_key(p, NULL, argv + ul);
731 /* Make sure there are no holes in the array, with the
732 * exception of argv[0] */
733 for (j = 1; j < n_argv; j++)
739 if (argv && argv[0] == NULL) {
740 argv[0] = strdup(path);
752 for (j = 0; j < n_argv; j++)
760 static int parse_kernel_address(sd_bus *b, const char **p, char **guid) {
761 _cleanup_free_ char *path = NULL;
769 while (**p != 0 && **p != ';') {
770 r = parse_address_key(p, "guid", guid);
776 r = parse_address_key(p, "path", &path);
795 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
796 _cleanup_free_ char *machine = NULL, *pid = NULL;
804 while (**p != 0 && **p != ';') {
805 r = parse_address_key(p, "guid", guid);
811 r = parse_address_key(p, "machine", &machine);
817 r = parse_address_key(p, "pid", &pid);
826 if (!machine == !pid)
830 if (!machine_name_is_valid(machine))
834 b->machine = machine;
842 r = parse_pid(pid, &b->nspid);
848 b->sockaddr.un.sun_family = AF_UNIX;
849 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
850 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + strlen("/var/run/dbus/system_bus_socket");
855 static int parse_container_kernel_address(sd_bus *b, const char **p, char **guid) {
856 _cleanup_free_ char *machine = NULL, *pid = NULL;
864 while (**p != 0 && **p != ';') {
865 r = parse_address_key(p, "guid", guid);
871 r = parse_address_key(p, "machine", &machine);
877 r = parse_address_key(p, "pid", &pid);
886 if (!machine == !pid)
890 if (!machine_name_is_valid(machine))
894 b->machine = machine;
902 r = parse_pid(pid, &b->nspid);
909 b->kernel = strdup("/sys/fs/kdbus/0-system/bus");
916 static void bus_reset_parsed_address(sd_bus *b) {
920 b->sockaddr_size = 0;
921 strv_free(b->exec_argv);
925 b->server_id = SD_ID128_NULL;
933 static int bus_parse_next_address(sd_bus *b) {
934 _cleanup_free_ char *guid = NULL;
942 if (b->address[b->address_index] == 0)
945 bus_reset_parsed_address(b);
947 a = b->address + b->address_index;
956 if (startswith(a, "unix:")) {
959 r = parse_unix_address(b, &a, &guid);
964 } else if (startswith(a, "tcp:")) {
967 r = parse_tcp_address(b, &a, &guid);
973 } else if (startswith(a, "unixexec:")) {
976 r = parse_exec_address(b, &a, &guid);
982 } else if (startswith(a, "kernel:")) {
985 r = parse_kernel_address(b, &a, &guid);
990 } else if (startswith(a, "x-machine-unix:")) {
993 r = parse_container_unix_address(b, &a, &guid);
998 } else if (startswith(a, "x-machine-kernel:")) {
1001 r = parse_container_kernel_address(b, &a, &guid);
1014 r = sd_id128_from_string(guid, &b->server_id);
1019 b->address_index = a - b->address;
1023 static int bus_start_address(sd_bus *b) {
1029 bool skipped = false;
1034 r = bus_socket_exec(b);
1036 else if ((b->nspid > 0 || b->machine) && b->kernel)
1037 r = bus_container_connect_kernel(b);
1038 else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC)
1039 r = bus_container_connect_socket(b);
1042 r = bus_kernel_connect(b);
1043 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
1044 r = bus_socket_connect(b);
1050 r = attach_io_events(b);
1055 b->last_connect_error = -r;
1058 r = bus_parse_next_address(b);
1062 return b->last_connect_error ? -b->last_connect_error : -ECONNREFUSED;
1066 int bus_next_address(sd_bus *b) {
1069 bus_reset_parsed_address(b);
1070 return bus_start_address(b);
1073 static int bus_start_fd(sd_bus *b) {
1078 assert(b->input_fd >= 0);
1079 assert(b->output_fd >= 0);
1081 r = fd_nonblock(b->input_fd, true);
1085 r = fd_cloexec(b->input_fd, true);
1089 if (b->input_fd != b->output_fd) {
1090 r = fd_nonblock(b->output_fd, true);
1094 r = fd_cloexec(b->output_fd, true);
1099 if (fstat(b->input_fd, &st) < 0)
1102 if (S_ISCHR(b->input_fd))
1103 return bus_kernel_take_fd(b);
1105 return bus_socket_take_fd(b);
1108 _public_ int sd_bus_start(sd_bus *bus) {
1111 assert_return(bus, -EINVAL);
1112 assert_return(bus->state == BUS_UNSET, -EPERM);
1113 assert_return(!bus_pid_changed(bus), -ECHILD);
1115 bus->state = BUS_OPENING;
1117 if (bus->is_server && bus->bus_client)
1120 if (bus->input_fd >= 0)
1121 r = bus_start_fd(bus);
1122 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->kernel || bus->machine)
1123 r = bus_start_address(bus);
1132 return bus_send_hello(bus);
1135 _public_ int sd_bus_open(sd_bus **ret) {
1140 assert_return(ret, -EINVAL);
1142 /* Let's connect to the starter bus if it is set, and
1143 * otherwise to the bus that is appropropriate for the scope
1144 * we are running in */
1146 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1148 if (streq(e, "system"))
1149 return sd_bus_open_system(ret);
1150 else if (STR_IN_SET(e, "session", "user"))
1151 return sd_bus_open_user(ret);
1154 e = secure_getenv("DBUS_STARTER_ADDRESS");
1156 return sd_bus_open_system(ret);
1163 r = sd_bus_set_address(b, e);
1167 b->bus_client = true;
1169 /* We don't know whether the bus is trusted or not, so better
1170 * be safe, and authenticate everything */
1172 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1173 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1175 r = sd_bus_start(b);
1187 int bus_set_address_system(sd_bus *b) {
1191 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1193 return sd_bus_set_address(b, e);
1195 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1198 _public_ int sd_bus_open_system(sd_bus **ret) {
1202 assert_return(ret, -EINVAL);
1208 r = bus_set_address_system(b);
1212 b->bus_client = true;
1213 b->is_system = true;
1215 /* Let's do per-method access control on the system bus. We
1216 * need the caller's UID and capability set for that. */
1218 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1219 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1221 r = sd_bus_start(b);
1233 int bus_set_address_user(sd_bus *b) {
1238 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1240 return sd_bus_set_address(b, e);
1242 e = secure_getenv("XDG_RUNTIME_DIR");
1244 _cleanup_free_ char *ee = NULL;
1246 ee = bus_address_escape(e);
1250 (void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT ";" UNIX_USER_BUS_ADDRESS_FMT, getuid(), ee);
1252 (void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT, getuid());
1260 _public_ int sd_bus_open_user(sd_bus **ret) {
1264 assert_return(ret, -EINVAL);
1270 r = bus_set_address_user(b);
1274 b->bus_client = true;
1277 /* We don't do any per-method access control on the user
1281 r = sd_bus_start(b);
1293 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1294 _cleanup_free_ char *e = NULL;
1295 char *m = NULL, *c = NULL;
1300 /* Let's see if we shall enter some container */
1301 m = strchr(host, ':');
1305 /* Let's make sure this is not a port of some kind,
1306 * and is a valid machine name. */
1307 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1310 /* Cut out the host part */
1311 t = strndupa(host, m - host - 1);
1312 e = bus_address_escape(t);
1316 c = strjoina(",argv4=--machine=", m);
1321 e = bus_address_escape(host);
1326 b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e, ",argv3=systemd-stdio-bridge", c, NULL);
1333 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1337 assert_return(host, -EINVAL);
1338 assert_return(ret, -EINVAL);
1340 r = sd_bus_new(&bus);
1344 r = bus_set_address_system_remote(bus, host);
1348 bus->bus_client = true;
1349 bus->trusted = false;
1350 bus->is_system = true;
1352 r = sd_bus_start(bus);
1364 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1365 _cleanup_free_ char *e = NULL;
1370 e = bus_address_escape(machine);
1374 b->address = strjoin("x-machine-kernel:machine=", e, ";x-machine-unix:machine=", e, NULL);
1381 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1385 assert_return(machine, -EINVAL);
1386 assert_return(ret, -EINVAL);
1387 assert_return(machine_name_is_valid(machine), -EINVAL);
1389 r = sd_bus_new(&bus);
1393 r = bus_set_address_system_machine(bus, machine);
1397 bus->bus_client = true;
1398 bus->trusted = false;
1399 bus->is_system = true;
1401 r = sd_bus_start(bus);
1413 _public_ void sd_bus_close(sd_bus *bus) {
1417 if (bus->state == BUS_CLOSED)
1419 if (bus_pid_changed(bus))
1422 bus->state = BUS_CLOSED;
1424 sd_bus_detach_event(bus);
1426 /* Drop all queued messages so that they drop references to
1427 * the bus object and the bus may be freed */
1428 bus_reset_queues(bus);
1430 if (!bus->is_kernel)
1433 /* We'll leave the fd open in case this is a kernel bus, since
1434 * there might still be memblocks around that reference this
1435 * bus, and they might need to invoke the KDBUS_CMD_FREE
1436 * ioctl on the fd when they are freed. */
1439 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1447 return sd_bus_unref(bus);
1450 static void bus_enter_closing(sd_bus *bus) {
1453 if (bus->state != BUS_OPENING &&
1454 bus->state != BUS_AUTHENTICATING &&
1455 bus->state != BUS_HELLO &&
1456 bus->state != BUS_RUNNING)
1459 bus->state = BUS_CLOSING;
1462 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1463 assert_return(bus, NULL);
1465 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1470 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1476 i = REFCNT_DEC(bus->n_ref);
1484 /// UNNEEDED by elogind
1486 _public_ int sd_bus_is_open(sd_bus *bus) {
1488 assert_return(bus, -EINVAL);
1489 assert_return(!bus_pid_changed(bus), -ECHILD);
1491 return BUS_IS_OPEN(bus->state);
1495 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1498 assert_return(bus, -EINVAL);
1499 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1500 assert_return(!bus_pid_changed(bus), -ECHILD);
1502 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
1505 if (type == SD_BUS_TYPE_UNIX_FD) {
1506 if (!(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD))
1509 r = bus_ensure_running(bus);
1513 return bus->can_fds;
1516 return bus_type_is_valid(type);
1519 /// UNNEEDED by elogind
1521 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1524 assert_return(bus, -EINVAL);
1525 assert_return(id, -EINVAL);
1526 assert_return(!bus_pid_changed(bus), -ECHILD);
1528 r = bus_ensure_running(bus);
1532 *id = bus->server_id;
1537 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1542 /* If we copy the same message to multiple
1543 * destinations, avoid using the same cookie
1545 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1550 timeout = BUS_DEFAULT_TIMEOUT;
1552 return bus_message_seal(m, ++b->cookie, timeout);
1555 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1556 bool remarshal = false;
1560 /* wrong packet version */
1561 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1564 /* wrong packet endianness */
1565 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1568 /* TODO: kdbus-messages received from the kernel contain data which is
1569 * not allowed to be passed to KDBUS_CMD_SEND. Therefore, we have to
1570 * force remarshaling of the message. Technically, we could just
1571 * recreate the kdbus message, but that is non-trivial as other parts of
1572 * the message refer to m->kdbus already. This should be fixed! */
1573 if ((*m)->kdbus && (*m)->release_kdbus)
1576 return remarshal ? bus_message_remarshal(b, m) : 0;
1579 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1583 /* Fake some timestamps, if they were requested, and not
1584 * already initialized */
1585 if (b->attach_flags & KDBUS_ATTACH_TIMESTAMP) {
1586 if (m->realtime <= 0)
1587 m->realtime = now(CLOCK_REALTIME);
1589 if (m->monotonic <= 0)
1590 m->monotonic = now(CLOCK_MONOTONIC);
1593 /* The bus specification says the serial number cannot be 0,
1594 * hence let's fill something in for synthetic messages. Since
1595 * synthetic messages might have a fake sender and we don't
1596 * want to interfere with the real sender's serial numbers we
1597 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1598 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1599 * even though kdbus can do 64bit. */
1600 return bus_message_seal(m, 0xFFFFFFFFULL, 0);
1603 static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
1610 r = bus_kernel_write_message(bus, m, hint_sync_call);
1612 r = bus_socket_write_message(bus, m, idx);
1617 if (bus->is_kernel || *idx >= BUS_MESSAGE_SIZE(m))
1618 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
1619 bus_message_type_to_string(m->header->type),
1620 strna(sd_bus_message_get_sender(m)),
1621 strna(sd_bus_message_get_destination(m)),
1622 strna(sd_bus_message_get_path(m)),
1623 strna(sd_bus_message_get_interface(m)),
1624 strna(sd_bus_message_get_member(m)),
1625 BUS_MESSAGE_COOKIE(m),
1627 strna(m->error.message));
1632 static int dispatch_wqueue(sd_bus *bus) {
1636 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1638 while (bus->wqueue_size > 0) {
1640 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
1644 /* Didn't do anything this time */
1646 else if (bus->is_kernel || bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1647 /* Fully written. Let's drop the entry from
1650 * This isn't particularly optimized, but
1651 * well, this is supposed to be our worst-case
1652 * buffer only, and the socket buffer is
1653 * supposed to be our primary buffer, and if
1654 * it got full, then all bets are off
1657 bus->wqueue_size --;
1658 sd_bus_message_unref(bus->wqueue[0]);
1659 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1669 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1673 return bus_kernel_read_message(bus, hint_priority, priority);
1675 return bus_socket_read_message(bus);
1678 int bus_rqueue_make_room(sd_bus *bus) {
1681 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1684 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1690 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1695 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1697 /* Note that the priority logic is only available on kdbus,
1698 * where the rqueue is unused. We check the rqueue here
1699 * anyway, because it's simple... */
1702 if (bus->rqueue_size > 0) {
1703 /* Dispatch a queued message */
1705 *m = bus->rqueue[0];
1706 bus->rqueue_size --;
1707 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1711 /* Try to read a new message */
1712 r = bus_read_message(bus, hint_priority, priority);
1722 static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
1723 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1726 assert_return(m, -EINVAL);
1731 assert_return(!bus_pid_changed(bus), -ECHILD);
1732 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1734 if (!BUS_IS_OPEN(bus->state))
1738 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1745 /* If the cookie number isn't kept, then we know that no reply
1747 if (!cookie && !m->sealed)
1748 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1750 r = bus_seal_message(bus, m, 0);
1754 /* Remarshall if we have to. This will possibly unref the
1755 * message and place a replacement in m */
1756 r = bus_remarshal_message(bus, &m);
1760 /* If this is a reply and no reply was requested, then let's
1761 * suppress this, if we can */
1765 if ((bus->state == BUS_RUNNING || bus->state == BUS_HELLO) && bus->wqueue_size <= 0) {
1768 r = bus_write_message(bus, m, hint_sync_call, &idx);
1770 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1771 bus_enter_closing(bus);
1778 if (!bus->is_kernel && idx < BUS_MESSAGE_SIZE(m)) {
1779 /* Wasn't fully written. So let's remember how
1780 * much was written. Note that the first entry
1781 * of the wqueue array is always allocated so
1782 * that we always can remember how much was
1784 bus->wqueue[0] = sd_bus_message_ref(m);
1785 bus->wqueue_size = 1;
1790 /* Just append it to the queue. */
1792 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1795 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1798 bus->wqueue[bus->wqueue_size ++] = sd_bus_message_ref(m);
1803 *cookie = BUS_MESSAGE_COOKIE(m);
1808 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1809 return bus_send_internal(bus, m, cookie, false);
1812 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1815 assert_return(m, -EINVAL);
1820 assert_return(!bus_pid_changed(bus), -ECHILD);
1822 if (!BUS_IS_OPEN(bus->state))
1825 if (!streq_ptr(m->destination, destination)) {
1830 r = sd_bus_message_set_destination(m, destination);
1835 return sd_bus_send(bus, m, cookie);
1838 static usec_t calc_elapse(uint64_t usec) {
1839 if (usec == (uint64_t) -1)
1842 return now(CLOCK_MONOTONIC) + usec;
1845 static int timeout_compare(const void *a, const void *b) {
1846 const struct reply_callback *x = a, *y = b;
1848 if (x->timeout != 0 && y->timeout == 0)
1851 if (x->timeout == 0 && y->timeout != 0)
1854 if (x->timeout < y->timeout)
1857 if (x->timeout > y->timeout)
1863 _public_ int sd_bus_call_async(
1867 sd_bus_message_handler_t callback,
1871 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1872 _cleanup_bus_slot_unref_ sd_bus_slot *s = NULL;
1875 assert_return(m, -EINVAL);
1876 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1877 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1878 assert_return(callback, -EINVAL);
1883 assert_return(!bus_pid_changed(bus), -ECHILD);
1884 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1886 if (!BUS_IS_OPEN(bus->state))
1889 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
1893 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1897 r = bus_seal_message(bus, m, usec);
1901 r = bus_remarshal_message(bus, &m);
1905 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
1909 s->reply_callback.callback = callback;
1911 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
1912 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
1914 s->reply_callback.cookie = 0;
1918 s->reply_callback.timeout = calc_elapse(m->timeout);
1919 if (s->reply_callback.timeout != 0) {
1920 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
1922 s->reply_callback.timeout = 0;
1927 r = sd_bus_send(bus, m, &s->reply_callback.cookie);
1938 int bus_ensure_running(sd_bus *bus) {
1943 if (bus->state == BUS_UNSET || bus->state == BUS_CLOSED || bus->state == BUS_CLOSING)
1945 if (bus->state == BUS_RUNNING)
1949 r = sd_bus_process(bus, NULL);
1952 if (bus->state == BUS_RUNNING)
1957 r = sd_bus_wait(bus, (uint64_t) -1);
1963 _public_ int sd_bus_call(
1967 sd_bus_error *error,
1968 sd_bus_message **reply) {
1970 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1976 assert_return(m, -EINVAL);
1977 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1978 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1979 assert_return(!bus_error_is_dirty(error), -EINVAL);
1984 assert_return(!bus_pid_changed(bus), -ECHILD);
1985 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1987 if (!BUS_IS_OPEN(bus->state))
1990 r = bus_ensure_running(bus);
1994 i = bus->rqueue_size;
1996 r = bus_seal_message(bus, m, usec);
2000 r = bus_remarshal_message(bus, &m);
2004 r = bus_send_internal(bus, m, &cookie, true);
2008 timeout = calc_elapse(m->timeout);
2013 while (i < bus->rqueue_size) {
2014 sd_bus_message *incoming = NULL;
2016 incoming = bus->rqueue[i];
2018 if (incoming->reply_cookie == cookie) {
2019 /* Found a match! */
2021 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2023 log_debug_bus_message(incoming);
2025 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2027 if (incoming->n_fds <= 0 || (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2031 sd_bus_message_unref(incoming);
2036 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2038 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR)
2039 r = sd_bus_error_copy(error, &incoming->error);
2043 sd_bus_message_unref(incoming);
2046 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2049 streq(bus->unique_name, incoming->sender)) {
2051 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2054 /* Our own message? Somebody is trying
2055 * to send its own client a message,
2056 * let's not dead-lock, let's fail
2059 sd_bus_message_unref(incoming);
2063 /* Try to read more, right-away */
2067 r = bus_read_message(bus, false, 0);
2069 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2070 bus_enter_closing(bus);
2082 n = now(CLOCK_MONOTONIC);
2088 left = (uint64_t) -1;
2090 r = bus_poll(bus, true, left);
2096 r = dispatch_wqueue(bus);
2098 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2099 bus_enter_closing(bus);
2108 _public_ int sd_bus_get_fd(sd_bus *bus) {
2110 assert_return(bus, -EINVAL);
2111 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2112 assert_return(!bus_pid_changed(bus), -ECHILD);
2114 return bus->input_fd;
2117 _public_ int sd_bus_get_events(sd_bus *bus) {
2120 assert_return(bus, -EINVAL);
2121 assert_return(!bus_pid_changed(bus), -ECHILD);
2123 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2126 if (bus->state == BUS_OPENING)
2128 else if (bus->state == BUS_AUTHENTICATING) {
2130 if (bus_socket_auth_needs_write(bus))
2135 } else if (bus->state == BUS_RUNNING || bus->state == BUS_HELLO) {
2136 if (bus->rqueue_size <= 0)
2138 if (bus->wqueue_size > 0)
2145 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2146 struct reply_callback *c;
2148 assert_return(bus, -EINVAL);
2149 assert_return(timeout_usec, -EINVAL);
2150 assert_return(!bus_pid_changed(bus), -ECHILD);
2152 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2155 if (bus->track_queue) {
2160 if (bus->state == BUS_CLOSING) {
2165 if (bus->state == BUS_AUTHENTICATING) {
2166 *timeout_usec = bus->auth_timeout;
2170 if (bus->state != BUS_RUNNING && bus->state != BUS_HELLO) {
2171 *timeout_usec = (uint64_t) -1;
2175 if (bus->rqueue_size > 0) {
2180 c = prioq_peek(bus->reply_callbacks_prioq);
2182 *timeout_usec = (uint64_t) -1;
2186 if (c->timeout == 0) {
2187 *timeout_usec = (uint64_t) -1;
2191 *timeout_usec = c->timeout;
2195 static int process_timeout(sd_bus *bus) {
2196 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2197 _cleanup_bus_message_unref_ sd_bus_message* m = NULL;
2198 struct reply_callback *c;
2205 c = prioq_peek(bus->reply_callbacks_prioq);
2209 n = now(CLOCK_MONOTONIC);
2213 r = bus_message_new_synthetic_error(
2216 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2221 r = bus_seal_synthetic_message(bus, m);
2225 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2228 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2231 slot = container_of(c, sd_bus_slot, reply_callback);
2233 bus->iteration_counter ++;
2235 bus->current_message = m;
2236 bus->current_slot = sd_bus_slot_ref(slot);
2237 bus->current_handler = c->callback;
2238 bus->current_userdata = slot->userdata;
2239 r = c->callback(m, slot->userdata, &error_buffer);
2240 bus->current_userdata = NULL;
2241 bus->current_handler = NULL;
2242 bus->current_slot = NULL;
2243 bus->current_message = NULL;
2245 if (slot->floating) {
2246 bus_slot_disconnect(slot);
2247 sd_bus_slot_unref(slot);
2250 sd_bus_slot_unref(slot);
2252 return bus_maybe_reply_error(m, r, &error_buffer);
2255 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2259 if (bus->state != BUS_HELLO)
2262 /* Let's make sure the first message on the bus is the HELLO
2263 * reply. But note that we don't actually parse the message
2264 * here (we leave that to the usual handling), we just verify
2265 * we don't let any earlier msg through. */
2267 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2268 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2271 if (m->reply_cookie != 1)
2277 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2278 _cleanup_bus_message_unref_ sd_bus_message *synthetic_reply = NULL;
2279 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2280 struct reply_callback *c;
2287 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2288 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2291 if (bus->is_kernel && (bus->hello_flags & KDBUS_HELLO_MONITOR))
2294 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2297 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2303 slot = container_of(c, sd_bus_slot, reply_callback);
2305 if (m->n_fds > 0 && !(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2307 /* If the reply contained a file descriptor which we
2308 * didn't want we pass an error instead. */
2310 r = bus_message_new_synthetic_error(
2313 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2318 /* Copy over original timestamp */
2319 synthetic_reply->realtime = m->realtime;
2320 synthetic_reply->monotonic = m->monotonic;
2321 synthetic_reply->seqnum = m->seqnum;
2323 r = bus_seal_synthetic_message(bus, synthetic_reply);
2327 m = synthetic_reply;
2329 r = sd_bus_message_rewind(m, true);
2334 if (c->timeout != 0) {
2335 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2339 bus->current_slot = sd_bus_slot_ref(slot);
2340 bus->current_handler = c->callback;
2341 bus->current_userdata = slot->userdata;
2342 r = c->callback(m, slot->userdata, &error_buffer);
2343 bus->current_userdata = NULL;
2344 bus->current_handler = NULL;
2345 bus->current_slot = NULL;
2347 if (slot->floating) {
2348 bus_slot_disconnect(slot);
2349 sd_bus_slot_unref(slot);
2352 sd_bus_slot_unref(slot);
2354 return bus_maybe_reply_error(m, r, &error_buffer);
2357 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2358 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2359 struct filter_callback *l;
2366 bus->filter_callbacks_modified = false;
2368 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2371 if (bus->filter_callbacks_modified)
2374 /* Don't run this more than once per iteration */
2375 if (l->last_iteration == bus->iteration_counter)
2378 l->last_iteration = bus->iteration_counter;
2380 r = sd_bus_message_rewind(m, true);
2384 slot = container_of(l, sd_bus_slot, filter_callback);
2386 bus->current_slot = sd_bus_slot_ref(slot);
2387 bus->current_handler = l->callback;
2388 bus->current_userdata = slot->userdata;
2389 r = l->callback(m, slot->userdata, &error_buffer);
2390 bus->current_userdata = NULL;
2391 bus->current_handler = NULL;
2392 bus->current_slot = sd_bus_slot_unref(slot);
2394 r = bus_maybe_reply_error(m, r, &error_buffer);
2400 } while (bus->filter_callbacks_modified);
2405 static int process_match(sd_bus *bus, sd_bus_message *m) {
2412 bus->match_callbacks_modified = false;
2414 r = bus_match_run(bus, &bus->match_callbacks, m);
2418 } while (bus->match_callbacks_modified);
2423 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2424 _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
2430 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2433 if (bus->manual_peer_interface)
2436 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2439 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2442 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2445 if (streq_ptr(m->member, "Ping"))
2446 r = sd_bus_message_new_method_return(m, &reply);
2447 else if (streq_ptr(m->member, "GetMachineId")) {
2451 r = sd_id128_get_machine(&id);
2455 r = sd_bus_message_new_method_return(m, &reply);
2459 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2461 r = sd_bus_message_new_method_errorf(
2463 SD_BUS_ERROR_UNKNOWN_METHOD,
2464 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2470 r = sd_bus_send(bus, reply, NULL);
2477 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2481 /* If we got a message with a file descriptor which we didn't
2482 * want to accept, then let's drop it. How can this even
2483 * happen? For example, when the kernel queues a message into
2484 * an activatable names's queue which allows fds, and then is
2485 * delivered to us later even though we ourselves did not
2488 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2494 if (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)
2497 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2498 return 1; /* just eat it up */
2500 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2503 static int process_message(sd_bus *bus, sd_bus_message *m) {
2509 bus->current_message = m;
2510 bus->iteration_counter++;
2512 log_debug_bus_message(m);
2514 r = process_hello(bus, m);
2518 r = process_reply(bus, m);
2522 r = process_fd_check(bus, m);
2526 r = process_filter(bus, m);
2530 r = process_match(bus, m);
2534 r = process_builtin(bus, m);
2538 r = bus_process_object(bus, m);
2541 bus->current_message = NULL;
2545 static int dispatch_track(sd_bus *bus) {
2548 if (!bus->track_queue)
2551 bus_track_dispatch(bus->track_queue);
2555 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2556 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2560 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
2562 r = process_timeout(bus);
2566 r = dispatch_wqueue(bus);
2570 r = dispatch_track(bus);
2574 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2580 r = process_message(bus, m);
2585 r = sd_bus_message_rewind(m, true);
2594 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2596 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2597 strna(sd_bus_message_get_sender(m)),
2598 strna(sd_bus_message_get_path(m)),
2599 strna(sd_bus_message_get_interface(m)),
2600 strna(sd_bus_message_get_member(m)));
2602 r = sd_bus_reply_method_errorf(
2604 SD_BUS_ERROR_UNKNOWN_OBJECT,
2605 "Unknown object '%s'.", m->path);
2619 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2620 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2621 struct reply_callback *c;
2625 assert(bus->state == BUS_CLOSING);
2627 c = ordered_hashmap_first(bus->reply_callbacks);
2629 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2632 /* First, fail all outstanding method calls */
2633 r = bus_message_new_synthetic_error(
2636 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2641 r = bus_seal_synthetic_message(bus, m);
2645 if (c->timeout != 0) {
2646 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2650 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2653 slot = container_of(c, sd_bus_slot, reply_callback);
2655 bus->iteration_counter++;
2657 bus->current_message = m;
2658 bus->current_slot = sd_bus_slot_ref(slot);
2659 bus->current_handler = c->callback;
2660 bus->current_userdata = slot->userdata;
2661 r = c->callback(m, slot->userdata, &error_buffer);
2662 bus->current_userdata = NULL;
2663 bus->current_handler = NULL;
2664 bus->current_slot = NULL;
2665 bus->current_message = NULL;
2667 if (slot->floating) {
2668 bus_slot_disconnect(slot);
2669 sd_bus_slot_unref(slot);
2672 sd_bus_slot_unref(slot);
2674 return bus_maybe_reply_error(m, r, &error_buffer);
2677 /* Then, synthesize a Disconnected message */
2678 r = sd_bus_message_new_signal(
2681 "/org/freedesktop/DBus/Local",
2682 "org.freedesktop.DBus.Local",
2687 bus_message_set_sender_local(bus, m);
2689 r = bus_seal_synthetic_message(bus, m);
2695 bus->current_message = m;
2696 bus->iteration_counter++;
2698 r = process_filter(bus, m);
2702 r = process_match(bus, m);
2714 bus->current_message = NULL;
2719 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2720 BUS_DONT_DESTROY(bus);
2723 /* Returns 0 when we didn't do anything. This should cause the
2724 * caller to invoke sd_bus_wait() before returning the next
2725 * time. Returns > 0 when we did something, which possibly
2726 * means *ret is filled in with an unprocessed message. */
2728 assert_return(bus, -EINVAL);
2729 assert_return(!bus_pid_changed(bus), -ECHILD);
2731 /* We don't allow recursively invoking sd_bus_process(). */
2732 assert_return(!bus->current_message, -EBUSY);
2733 assert(!bus->current_slot);
2735 switch (bus->state) {
2744 r = bus_socket_process_opening(bus);
2745 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2746 bus_enter_closing(bus);
2754 case BUS_AUTHENTICATING:
2755 r = bus_socket_process_authenticating(bus);
2756 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2757 bus_enter_closing(bus);
2769 r = process_running(bus, hint_priority, priority, ret);
2770 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2771 bus_enter_closing(bus);
2781 return process_closing(bus, ret);
2784 assert_not_reached("Unknown state");
2787 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2788 return bus_process_internal(bus, false, 0, ret);
2791 /// UNNEEDED by elogind
2793 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2794 return bus_process_internal(bus, true, priority, ret);
2798 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2799 struct pollfd p[2] = {};
2802 usec_t m = USEC_INFINITY;
2806 if (bus->state == BUS_CLOSING)
2809 if (!BUS_IS_OPEN(bus->state))
2812 e = sd_bus_get_events(bus);
2817 /* The caller really needs some more data, he doesn't
2818 * care about what's already read, or any timeouts
2819 * except its own. */
2823 /* The caller wants to process if there's something to
2824 * process, but doesn't care otherwise */
2826 r = sd_bus_get_timeout(bus, &until);
2831 nw = now(CLOCK_MONOTONIC);
2832 m = until > nw ? until - nw : 0;
2836 if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
2839 p[0].fd = bus->input_fd;
2840 if (bus->output_fd == bus->input_fd) {
2844 p[0].events = e & POLLIN;
2845 p[1].fd = bus->output_fd;
2846 p[1].events = e & POLLOUT;
2850 r = ppoll(p, n, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
2854 return r > 0 ? 1 : 0;
2857 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2859 assert_return(bus, -EINVAL);
2860 assert_return(!bus_pid_changed(bus), -ECHILD);
2862 if (bus->state == BUS_CLOSING)
2865 if (!BUS_IS_OPEN(bus->state))
2868 if (bus->rqueue_size > 0)
2871 return bus_poll(bus, false, timeout_usec);
2874 _public_ int sd_bus_flush(sd_bus *bus) {
2877 assert_return(bus, -EINVAL);
2878 assert_return(!bus_pid_changed(bus), -ECHILD);
2880 if (bus->state == BUS_CLOSING)
2883 if (!BUS_IS_OPEN(bus->state))
2886 r = bus_ensure_running(bus);
2890 if (bus->wqueue_size <= 0)
2894 r = dispatch_wqueue(bus);
2896 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2897 bus_enter_closing(bus);
2904 if (bus->wqueue_size <= 0)
2907 r = bus_poll(bus, false, (uint64_t) -1);
2913 _public_ int sd_bus_add_filter(
2916 sd_bus_message_handler_t callback,
2921 assert_return(bus, -EINVAL);
2922 assert_return(callback, -EINVAL);
2923 assert_return(!bus_pid_changed(bus), -ECHILD);
2925 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
2929 s->filter_callback.callback = callback;
2931 bus->filter_callbacks_modified = true;
2932 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
2940 _public_ int sd_bus_add_match(
2944 sd_bus_message_handler_t callback,
2947 struct bus_match_component *components = NULL;
2948 unsigned n_components = 0;
2949 sd_bus_slot *s = NULL;
2952 assert_return(bus, -EINVAL);
2953 assert_return(match, -EINVAL);
2954 assert_return(!bus_pid_changed(bus), -ECHILD);
2956 r = bus_match_parse(match, &components, &n_components);
2960 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
2966 s->match_callback.callback = callback;
2967 s->match_callback.cookie = ++bus->match_cookie;
2969 if (bus->bus_client) {
2970 enum bus_match_scope scope;
2972 scope = bus_match_get_scope(components, n_components);
2974 /* Do not install server-side matches for matches
2975 * against the local service, interface or bus
2977 if (scope != BUS_MATCH_LOCAL) {
2979 if (!bus->is_kernel) {
2980 /* When this is not a kernel transport, we
2981 * store the original match string, so that we
2982 * can use it to remove the match again */
2984 s->match_callback.match_string = strdup(match);
2985 if (!s->match_callback.match_string) {
2991 r = bus_add_match_internal(bus, s->match_callback.match_string, components, n_components, s->match_callback.cookie);
2995 s->match_added = true;
2999 bus->match_callbacks_modified = true;
3000 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3009 bus_match_parse_free(components, n_components);
3010 sd_bus_slot_unref(s);
3015 /// UNNEEDED by elogind
3017 int bus_remove_match_by_string(
3020 sd_bus_message_handler_t callback,
3023 struct bus_match_component *components = NULL;
3024 unsigned n_components = 0;
3025 struct match_callback *c;
3028 assert_return(bus, -EINVAL);
3029 assert_return(match, -EINVAL);
3030 assert_return(!bus_pid_changed(bus), -ECHILD);
3032 r = bus_match_parse(match, &components, &n_components);
3036 r = bus_match_find(&bus->match_callbacks, components, n_components, NULL, NULL, &c);
3040 sd_bus_slot_unref(container_of(c, sd_bus_slot, match_callback));
3043 bus_match_parse_free(components, n_components);
3049 bool bus_pid_changed(sd_bus *bus) {
3052 /* We don't support people creating a bus connection and
3053 * keeping it around over a fork(). Let's complain. */
3055 return bus->original_pid != getpid();
3058 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3059 sd_bus *bus = userdata;
3064 r = sd_bus_process(bus, NULL);
3071 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3072 sd_bus *bus = userdata;
3077 r = sd_bus_process(bus, NULL);
3084 static int prepare_callback(sd_event_source *s, void *userdata) {
3085 sd_bus *bus = userdata;
3092 e = sd_bus_get_events(bus);
3096 if (bus->output_fd != bus->input_fd) {
3098 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3102 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3106 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3111 r = sd_bus_get_timeout(bus, &until);
3117 j = sd_event_source_set_time(bus->time_event_source, until);
3122 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3129 static int quit_callback(sd_event_source *event, void *userdata) {
3130 sd_bus *bus = userdata;
3140 static int attach_io_events(sd_bus *bus) {
3145 if (bus->input_fd < 0)
3151 if (!bus->input_io_event_source) {
3152 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3156 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3160 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3164 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3166 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3171 if (bus->output_fd != bus->input_fd) {
3172 assert(bus->output_fd >= 0);
3174 if (!bus->output_io_event_source) {
3175 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3179 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3183 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3185 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3194 static void detach_io_events(sd_bus *bus) {
3197 if (bus->input_io_event_source) {
3198 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3199 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3202 if (bus->output_io_event_source) {
3203 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3204 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3208 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3211 assert_return(bus, -EINVAL);
3212 assert_return(!bus->event, -EBUSY);
3214 assert(!bus->input_io_event_source);
3215 assert(!bus->output_io_event_source);
3216 assert(!bus->time_event_source);
3219 bus->event = sd_event_ref(event);
3221 r = sd_event_default(&bus->event);
3226 bus->event_priority = priority;
3228 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3232 r = sd_event_source_set_priority(bus->time_event_source, priority);
3236 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3240 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3244 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3248 r = attach_io_events(bus);
3255 sd_bus_detach_event(bus);
3259 _public_ int sd_bus_detach_event(sd_bus *bus) {
3260 assert_return(bus, -EINVAL);
3265 detach_io_events(bus);
3267 if (bus->time_event_source) {
3268 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3269 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3272 if (bus->quit_event_source) {
3273 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3274 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3277 bus->event = sd_event_unref(bus->event);
3281 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3282 assert_return(bus, NULL);
3287 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3288 assert_return(bus, NULL);
3290 return bus->current_message;
3293 /// UNNEEDED by elogind
3295 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3296 assert_return(bus, NULL);
3298 return bus->current_slot;
3302 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3303 assert_return(bus, NULL);
3305 return bus->current_handler;
3308 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3309 assert_return(bus, NULL);
3311 return bus->current_userdata;
3314 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3319 assert(default_bus);
3322 return !!*default_bus;
3325 *ret = sd_bus_ref(*default_bus);
3333 b->default_bus_ptr = default_bus;
3341 _public_ int sd_bus_default_system(sd_bus **ret) {
3342 static thread_local sd_bus *default_system_bus = NULL;
3344 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3347 _public_ int sd_bus_default_user(sd_bus **ret) {
3348 static thread_local sd_bus *default_user_bus = NULL;
3350 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3353 _public_ int sd_bus_default(sd_bus **ret) {
3357 /* Let's try our best to reuse another cached connection. If
3358 * the starter bus type is set, connect via our normal
3359 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3360 * we can share the connection with the user/system default
3363 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3365 if (streq(e, "system"))
3366 return sd_bus_default_system(ret);
3367 else if (STR_IN_SET(e, "user", "session"))
3368 return sd_bus_default_user(ret);
3371 /* No type is specified, so we have not other option than to
3372 * use the starter address if it is set. */
3374 e = secure_getenv("DBUS_STARTER_ADDRESS");
3376 static thread_local sd_bus *default_starter_bus = NULL;
3378 return bus_default(sd_bus_open, &default_starter_bus, ret);
3381 /* Finally, if nothing is set use the cached connection for
3382 * the right scope */
3384 return sd_bus_default_system(ret);
3387 /// UNNEEDED by elogind
3389 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3390 assert_return(b, -EINVAL);
3391 assert_return(tid, -EINVAL);
3392 assert_return(!bus_pid_changed(b), -ECHILD);
3400 return sd_event_get_tid(b->event, tid);
3405 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3406 _cleanup_free_ char *e = NULL;
3409 assert_return(object_path_is_valid(prefix), -EINVAL);
3410 assert_return(external_id, -EINVAL);
3411 assert_return(ret_path, -EINVAL);
3413 e = bus_label_escape(external_id);
3417 ret = strjoin(prefix, "/", e, NULL);
3425 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3429 assert_return(object_path_is_valid(path), -EINVAL);
3430 assert_return(object_path_is_valid(prefix), -EINVAL);
3431 assert_return(external_id, -EINVAL);
3433 e = object_path_startswith(path, prefix);
3435 *external_id = NULL;
3439 ret = bus_label_unescape(e);
3448 _public_ int sd_bus_try_close(sd_bus *bus) {
3451 assert_return(bus, -EINVAL);
3452 assert_return(!bus_pid_changed(bus), -ECHILD);
3454 if (!bus->is_kernel)
3457 if (!BUS_IS_OPEN(bus->state))
3460 if (bus->rqueue_size > 0)
3463 if (bus->wqueue_size > 0)
3466 r = bus_kernel_try_close(bus);
3474 /// UNNEEDED by elogind
3476 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3477 assert_return(bus, -EINVAL);
3478 assert_return(description, -EINVAL);
3479 assert_return(bus->description, -ENXIO);
3480 assert_return(!bus_pid_changed(bus), -ECHILD);
3482 *description = bus->description;
3487 int bus_get_root_path(sd_bus *bus) {
3490 if (bus->cgroup_root)
3493 r = cg_get_root_path(&bus->cgroup_root);
3495 bus->cgroup_root = strdup("/");
3496 if (!bus->cgroup_root)
3505 /// UNNEEDED by elogind
3507 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3510 assert_return(bus, -EINVAL);
3511 assert_return(scope, -EINVAL);
3512 assert_return(!bus_pid_changed(bus), -ECHILD);
3514 if (bus->is_kernel) {
3515 _cleanup_free_ char *n = NULL;
3518 r = bus_kernel_get_bus_name(bus, &n);
3522 if (streq(n, "0-system")) {
3527 dash = strchr(n, '-');
3528 if (streq_ptr(dash, "-user")) {
3539 if (bus->is_system) {
3547 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3549 assert_return(bus, -EINVAL);
3550 assert_return(address, -EINVAL);
3551 assert_return(!bus_pid_changed(bus), -ECHILD);
3554 *address = bus->address;
3561 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
3562 assert_return(bus, -EINVAL);
3563 assert_return(mask, -EINVAL);
3564 assert_return(!bus_pid_changed(bus), -ECHILD);
3566 *mask = bus->creds_mask;
3570 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
3571 assert_return(bus, -EINVAL);
3572 assert_return(!bus_pid_changed(bus), -ECHILD);
3574 return bus->bus_client;
3577 _public_ int sd_bus_is_server(sd_bus *bus) {
3578 assert_return(bus, -EINVAL);
3579 assert_return(!bus_pid_changed(bus), -ECHILD);
3581 return bus->is_server;
3584 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
3585 assert_return(bus, -EINVAL);
3586 assert_return(!bus_pid_changed(bus), -ECHILD);
3588 return bus->anonymous_auth;
3591 _public_ int sd_bus_is_trusted(sd_bus *bus) {
3592 assert_return(bus, -EINVAL);
3593 assert_return(!bus_pid_changed(bus), -ECHILD);
3595 return bus->trusted;
3598 _public_ int sd_bus_is_monitor(sd_bus *bus) {
3599 assert_return(bus, -EINVAL);
3600 assert_return(!bus_pid_changed(bus), -ECHILD);
3602 return !!(bus->hello_flags & KDBUS_HELLO_MONITOR);