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/>.
32 #include "alloc-util.h"
33 #include "bus-container.h"
34 #include "bus-control.h"
35 #include "bus-internal.h"
36 #include "bus-kernel.h"
37 #include "bus-label.h"
38 #include "bus-message.h"
39 #include "bus-objects.h"
40 #include "bus-protocol.h"
42 #include "bus-socket.h"
43 #include "bus-track.h"
46 #include "cgroup-util.h"
49 #include "hexdecoct.h"
50 #include "hostname-util.h"
53 #include "parse-util.h"
54 #include "string-util.h"
58 #define log_debug_bus_message(m) \
60 sd_bus_message *_mm = (m); \
61 log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s", \
62 bus_message_type_to_string(_mm->header->type), \
63 strna(sd_bus_message_get_sender(_mm)), \
64 strna(sd_bus_message_get_destination(_mm)), \
65 strna(sd_bus_message_get_path(_mm)), \
66 strna(sd_bus_message_get_interface(_mm)), \
67 strna(sd_bus_message_get_member(_mm)), \
68 BUS_MESSAGE_COOKIE(_mm), \
70 strna(_mm->error.message)); \
73 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
74 static int attach_io_events(sd_bus *b);
75 static void detach_io_events(sd_bus *b);
77 static thread_local sd_bus *default_system_bus = NULL;
78 // UNNEEDED static thread_local sd_bus *default_user_bus = NULL;
79 static thread_local sd_bus *default_starter_bus = NULL;
81 static void bus_close_fds(sd_bus *b) {
86 if (b->input_fd != b->output_fd)
87 safe_close(b->output_fd);
88 b->output_fd = b->input_fd = safe_close(b->input_fd);
91 static void bus_reset_queues(sd_bus *b) {
94 while (b->rqueue_size > 0)
95 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
97 b->rqueue = mfree(b->rqueue);
98 b->rqueue_allocated = 0;
100 while (b->wqueue_size > 0)
101 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
103 b->wqueue = mfree(b->wqueue);
104 b->wqueue_allocated = 0;
107 static void bus_free(sd_bus *b) {
111 assert(!b->track_queue);
113 b->state = BUS_CLOSED;
115 sd_bus_detach_event(b);
117 while ((s = b->slots)) {
118 /* At this point only floating slots can still be
119 * around, because the non-floating ones keep a
120 * reference to the bus, and we thus couldn't be
121 * destructing right now... We forcibly disconnect the
122 * slots here, so that they still can be referenced by
123 * apps, but are dead. */
126 bus_slot_disconnect(s);
127 sd_bus_slot_unref(s);
130 if (b->default_bus_ptr)
131 *b->default_bus_ptr = NULL;
136 munmap(b->kdbus_buffer, KDBUS_POOL_SIZE);
140 free(b->unique_name);
141 free(b->auth_buffer);
146 free(b->cgroup_root);
147 free(b->description);
150 strv_free(b->exec_argv);
152 close_many(b->fds, b->n_fds);
157 ordered_hashmap_free_free(b->reply_callbacks);
158 prioq_free(b->reply_callbacks_prioq);
160 assert(b->match_callbacks.type == BUS_MATCH_ROOT);
161 bus_match_free(&b->match_callbacks);
163 hashmap_free_free(b->vtable_methods);
164 hashmap_free_free(b->vtable_properties);
166 assert(hashmap_isempty(b->nodes));
167 hashmap_free(b->nodes);
169 bus_kernel_flush_memfd(b);
171 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
176 _public_ int sd_bus_new(sd_bus **ret) {
179 assert_return(ret, -EINVAL);
185 r->n_ref = REFCNT_INIT;
186 r->input_fd = r->output_fd = -1;
187 r->message_version = 1;
188 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
189 r->hello_flags |= KDBUS_HELLO_ACCEPT_FD;
190 r->attach_flags |= KDBUS_ATTACH_NAMES;
191 r->original_pid = getpid();
193 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
195 /* We guarantee that wqueue always has space for at least one
197 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
206 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
209 assert_return(bus, -EINVAL);
210 assert_return(bus->state == BUS_UNSET, -EPERM);
211 assert_return(address, -EINVAL);
212 assert_return(!bus_pid_changed(bus), -ECHILD);
224 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
225 assert_return(bus, -EINVAL);
226 assert_return(bus->state == BUS_UNSET, -EPERM);
227 assert_return(input_fd >= 0, -EBADF);
228 assert_return(output_fd >= 0, -EBADF);
229 assert_return(!bus_pid_changed(bus), -ECHILD);
231 bus->input_fd = input_fd;
232 bus->output_fd = output_fd;
236 /// UNNEEDED by elogind
238 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
241 assert_return(bus, -EINVAL);
242 assert_return(bus->state == BUS_UNSET, -EPERM);
243 assert_return(path, -EINVAL);
244 assert_return(!strv_isempty(argv), -EINVAL);
245 assert_return(!bus_pid_changed(bus), -ECHILD);
257 free(bus->exec_path);
258 strv_free(bus->exec_argv);
266 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
267 assert_return(bus, -EINVAL);
268 assert_return(bus->state == BUS_UNSET, -EPERM);
269 assert_return(!bus_pid_changed(bus), -ECHILD);
271 bus->bus_client = !!b;
275 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
276 assert_return(bus, -EINVAL);
277 assert_return(bus->state == BUS_UNSET, -EPERM);
278 assert_return(!bus_pid_changed(bus), -ECHILD);
280 SET_FLAG(bus->hello_flags, KDBUS_HELLO_MONITOR, b);
284 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
285 assert_return(bus, -EINVAL);
286 assert_return(bus->state == BUS_UNSET, -EPERM);
287 assert_return(!bus_pid_changed(bus), -ECHILD);
289 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ACCEPT_FD, b);
293 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
295 assert_return(bus, -EINVAL);
296 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
297 assert_return(!bus_pid_changed(bus), -ECHILD);
299 new_flags = bus->attach_flags;
300 SET_FLAG(new_flags, KDBUS_ATTACH_TIMESTAMP, b);
302 if (bus->attach_flags == new_flags)
305 bus->attach_flags = new_flags;
306 if (bus->state != BUS_UNSET && bus->is_kernel)
307 bus_kernel_realize_attach_flags(bus);
312 _public_ int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t mask) {
315 assert_return(bus, -EINVAL);
316 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
317 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
318 assert_return(!bus_pid_changed(bus), -ECHILD);
321 bus->creds_mask |= mask;
323 bus->creds_mask &= ~mask;
325 /* The well knowns we need unconditionally, so that matches can work */
326 bus->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
328 /* Make sure we don't lose the timestamp flag */
329 new_flags = (bus->attach_flags & KDBUS_ATTACH_TIMESTAMP) | attach_flags_to_kdbus(bus->creds_mask);
330 if (bus->attach_flags == new_flags)
333 bus->attach_flags = new_flags;
334 if (bus->state != BUS_UNSET && bus->is_kernel)
335 bus_kernel_realize_attach_flags(bus);
340 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
341 assert_return(bus, -EINVAL);
342 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
343 assert_return(bus->state == BUS_UNSET, -EPERM);
344 assert_return(!bus_pid_changed(bus), -ECHILD);
346 bus->is_server = !!b;
347 bus->server_id = server_id;
351 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
352 assert_return(bus, -EINVAL);
353 assert_return(bus->state == BUS_UNSET, -EPERM);
354 assert_return(!bus_pid_changed(bus), -ECHILD);
356 bus->anonymous_auth = !!b;
360 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
361 assert_return(bus, -EINVAL);
362 assert_return(bus->state == BUS_UNSET, -EPERM);
363 assert_return(!bus_pid_changed(bus), -ECHILD);
369 _public_ int sd_bus_set_description(sd_bus *bus, const char *description) {
370 assert_return(bus, -EINVAL);
371 assert_return(bus->state == BUS_UNSET, -EPERM);
372 assert_return(!bus_pid_changed(bus), -ECHILD);
374 return free_and_strdup(&bus->description, description);
378 _public_ int sd_bus_set_allow_interactive_authorization(sd_bus *bus, int b) {
379 assert_return(bus, -EINVAL);
380 assert_return(!bus_pid_changed(bus), -ECHILD);
382 bus->allow_interactive_authorization = !!b;
386 /// UNNEEDED by elogind
388 _public_ int sd_bus_get_allow_interactive_authorization(sd_bus *bus) {
389 assert_return(bus, -EINVAL);
390 assert_return(!bus_pid_changed(bus), -ECHILD);
392 return bus->allow_interactive_authorization;
396 static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) {
404 assert(bus->state == BUS_HELLO || bus->state == BUS_CLOSING);
406 r = sd_bus_message_get_errno(reply);
410 r = sd_bus_message_read(reply, "s", &s);
414 if (!service_name_is_valid(s) || s[0] != ':')
417 bus->unique_name = strdup(s);
418 if (!bus->unique_name)
421 if (bus->state == BUS_HELLO)
422 bus->state = BUS_RUNNING;
427 static int bus_send_hello(sd_bus *bus) {
428 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
433 if (!bus->bus_client || bus->is_kernel)
436 r = sd_bus_message_new_method_call(
439 "org.freedesktop.DBus",
440 "/org/freedesktop/DBus",
441 "org.freedesktop.DBus",
446 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
449 int bus_start_running(sd_bus *bus) {
452 if (bus->bus_client && !bus->is_kernel) {
453 bus->state = BUS_HELLO;
457 bus->state = BUS_RUNNING;
461 static int parse_address_key(const char **p, const char *key, char **value) {
462 size_t l, n = 0, allocated = 0;
472 if (strncmp(*p, key, l) != 0)
485 while (*a != ';' && *a != ',' && *a != 0) {
503 c = (char) ((x << 4) | y);
510 if (!GREEDY_REALLOC(r, allocated, n + 2))
534 static void skip_address_key(const char **p) {
538 *p += strcspn(*p, ",");
544 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
545 _cleanup_free_ char *path = NULL, *abstract = NULL;
554 while (**p != 0 && **p != ';') {
555 r = parse_address_key(p, "guid", guid);
561 r = parse_address_key(p, "path", &path);
567 r = parse_address_key(p, "abstract", &abstract);
576 if (!path && !abstract)
579 if (path && abstract)
584 if (l > sizeof(b->sockaddr.un.sun_path))
587 b->sockaddr.un.sun_family = AF_UNIX;
588 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
589 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
590 } else if (abstract) {
591 l = strlen(abstract);
592 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
595 b->sockaddr.un.sun_family = AF_UNIX;
596 b->sockaddr.un.sun_path[0] = 0;
597 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
598 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
604 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
605 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
607 struct addrinfo *result, hints = {
608 .ai_socktype = SOCK_STREAM,
609 .ai_flags = AI_ADDRCONFIG,
617 while (**p != 0 && **p != ';') {
618 r = parse_address_key(p, "guid", guid);
624 r = parse_address_key(p, "host", &host);
630 r = parse_address_key(p, "port", &port);
636 r = parse_address_key(p, "family", &family);
649 if (streq(family, "ipv4"))
650 hints.ai_family = AF_INET;
651 else if (streq(family, "ipv6"))
652 hints.ai_family = AF_INET6;
657 r = getaddrinfo(host, port, &hints, &result);
661 return -EADDRNOTAVAIL;
663 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
664 b->sockaddr_size = result->ai_addrlen;
666 freeaddrinfo(result);
671 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
673 unsigned n_argv = 0, j;
675 size_t allocated = 0;
683 while (**p != 0 && **p != ';') {
684 r = parse_address_key(p, "guid", guid);
690 r = parse_address_key(p, "path", &path);
696 if (startswith(*p, "argv")) {
700 ul = strtoul(*p + 4, (char**) p, 10);
701 if (errno > 0 || **p != '=' || ul > 256) {
709 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
717 r = parse_address_key(p, NULL, argv + ul);
732 /* Make sure there are no holes in the array, with the
733 * exception of argv[0] */
734 for (j = 1; j < n_argv; j++)
740 if (argv && argv[0] == NULL) {
741 argv[0] = strdup(path);
753 for (j = 0; j < n_argv; j++)
761 static int parse_kernel_address(sd_bus *b, const char **p, char **guid) {
762 _cleanup_free_ char *path = NULL;
770 while (**p != 0 && **p != ';') {
771 r = parse_address_key(p, "guid", guid);
777 r = parse_address_key(p, "path", &path);
796 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
797 _cleanup_free_ char *machine = NULL, *pid = NULL;
805 while (**p != 0 && **p != ';') {
806 r = parse_address_key(p, "guid", guid);
812 r = parse_address_key(p, "machine", &machine);
818 r = parse_address_key(p, "pid", &pid);
827 if (!machine == !pid)
831 if (!machine_name_is_valid(machine))
835 b->machine = machine;
838 b->machine = mfree(b->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;
897 b->machine = mfree(b->machine);
901 r = parse_pid(pid, &b->nspid);
907 r = free_and_strdup(&b->kernel, "/sys/fs/kdbus/0-system/bus");
914 static void bus_reset_parsed_address(sd_bus *b) {
918 b->sockaddr_size = 0;
919 b->exec_argv = strv_free(b->exec_argv);
920 b->exec_path = mfree(b->exec_path);
921 b->server_id = SD_ID128_NULL;
922 b->kernel = mfree(b->kernel);
923 b->machine = mfree(b->machine);
927 static int bus_parse_next_address(sd_bus *b) {
928 _cleanup_free_ char *guid = NULL;
936 if (b->address[b->address_index] == 0)
939 bus_reset_parsed_address(b);
941 a = b->address + b->address_index;
950 if (startswith(a, "unix:")) {
953 r = parse_unix_address(b, &a, &guid);
958 } else if (startswith(a, "tcp:")) {
961 r = parse_tcp_address(b, &a, &guid);
967 } else if (startswith(a, "unixexec:")) {
970 r = parse_exec_address(b, &a, &guid);
976 } else if (startswith(a, "kernel:")) {
979 r = parse_kernel_address(b, &a, &guid);
984 } else if (startswith(a, "x-machine-unix:")) {
987 r = parse_container_unix_address(b, &a, &guid);
992 } else if (startswith(a, "x-machine-kernel:")) {
995 r = parse_container_kernel_address(b, &a, &guid);
1008 r = sd_id128_from_string(guid, &b->server_id);
1013 b->address_index = a - b->address;
1017 static int bus_start_address(sd_bus *b) {
1018 bool container_kdbus_available = false;
1019 bool kdbus_available = false;
1025 bool skipped = false;
1030 * Usually, if you provide multiple different bus-addresses, we
1031 * try all of them in order. We use the first one that
1032 * succeeds. However, if you mix kernel and unix addresses, we
1033 * never try unix-addresses if a previous kernel address was
1034 * tried and kdbus was available. This is required to prevent
1035 * clients to fallback to the bus-proxy if kdbus is available
1036 * but failed (eg., too many connections).
1040 r = bus_socket_exec(b);
1041 else if ((b->nspid > 0 || b->machine) && b->kernel) {
1042 r = bus_container_connect_kernel(b);
1043 if (r < 0 && !IN_SET(r, -ENOENT, -ESOCKTNOSUPPORT))
1044 container_kdbus_available = true;
1046 } else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC) {
1047 if (!container_kdbus_available)
1048 r = bus_container_connect_socket(b);
1052 } else if (b->kernel) {
1053 r = bus_kernel_connect(b);
1054 if (r < 0 && !IN_SET(r, -ENOENT, -ESOCKTNOSUPPORT))
1055 kdbus_available = true;
1057 } else if (b->sockaddr.sa.sa_family != AF_UNSPEC) {
1058 if (!kdbus_available)
1059 r = bus_socket_connect(b);
1067 r = attach_io_events(b);
1072 b->last_connect_error = -r;
1075 r = bus_parse_next_address(b);
1079 return b->last_connect_error ? -b->last_connect_error : -ECONNREFUSED;
1083 int bus_next_address(sd_bus *b) {
1086 bus_reset_parsed_address(b);
1087 return bus_start_address(b);
1090 static int bus_start_fd(sd_bus *b) {
1095 assert(b->input_fd >= 0);
1096 assert(b->output_fd >= 0);
1098 r = fd_nonblock(b->input_fd, true);
1102 r = fd_cloexec(b->input_fd, true);
1106 if (b->input_fd != b->output_fd) {
1107 r = fd_nonblock(b->output_fd, true);
1111 r = fd_cloexec(b->output_fd, true);
1116 if (fstat(b->input_fd, &st) < 0)
1119 if (S_ISCHR(b->input_fd))
1120 return bus_kernel_take_fd(b);
1122 return bus_socket_take_fd(b);
1125 _public_ int sd_bus_start(sd_bus *bus) {
1128 assert_return(bus, -EINVAL);
1129 assert_return(bus->state == BUS_UNSET, -EPERM);
1130 assert_return(!bus_pid_changed(bus), -ECHILD);
1132 bus->state = BUS_OPENING;
1134 if (bus->is_server && bus->bus_client)
1137 if (bus->input_fd >= 0)
1138 r = bus_start_fd(bus);
1139 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->kernel || bus->machine)
1140 r = bus_start_address(bus);
1149 return bus_send_hello(bus);
1152 _public_ int sd_bus_open(sd_bus **ret) {
1157 assert_return(ret, -EINVAL);
1159 /* Let's connect to the starter bus if it is set, and
1160 * otherwise to the bus that is appropropriate for the scope
1161 * we are running in */
1163 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1165 if (streq(e, "system"))
1166 return sd_bus_open_system(ret);
1167 /// elogind does not support systemd units
1169 else if (STR_IN_SET(e, "session", "user"))
1170 return sd_bus_open_user(ret);
1174 e = secure_getenv("DBUS_STARTER_ADDRESS");
1176 /// elogind does not support systemd units
1178 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1179 return sd_bus_open_user(ret);
1182 return sd_bus_open_system(ret);
1189 r = sd_bus_set_address(b, e);
1193 b->bus_client = true;
1195 /* We don't know whether the bus is trusted or not, so better
1196 * be safe, and authenticate everything */
1198 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1199 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1201 r = sd_bus_start(b);
1213 int bus_set_address_system(sd_bus *b) {
1217 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1219 return sd_bus_set_address(b, e);
1221 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1224 _public_ int sd_bus_open_system(sd_bus **ret) {
1228 assert_return(ret, -EINVAL);
1234 r = bus_set_address_system(b);
1238 b->bus_client = true;
1239 b->is_system = true;
1241 /* Let's do per-method access control on the system bus. We
1242 * need the caller's UID and capability set for that. */
1244 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1245 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1247 r = sd_bus_start(b);
1259 /// elogind can not open/use a user bus
1261 int bus_set_address_user(sd_bus *b) {
1268 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1270 return sd_bus_set_address(b, e);
1272 r = cg_pid_get_owner_uid(0, &uid);
1276 e = secure_getenv("XDG_RUNTIME_DIR");
1278 _cleanup_free_ char *ee = NULL;
1280 ee = bus_address_escape(e);
1284 (void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT ";" UNIX_USER_BUS_ADDRESS_FMT, uid, ee);
1286 (void) asprintf(&b->address, KERNEL_USER_BUS_ADDRESS_FMT, uid);
1295 _public_ int sd_bus_open_user(sd_bus **ret) {
1296 /// elogind does not support user buses
1301 assert_return(ret, -EINVAL);
1307 r = bus_set_address_user(b);
1311 b->bus_client = true;
1314 /* We don't do any per-method access control on the user
1318 r = sd_bus_start(b);
1329 return sd_bus_open_system(ret);
1333 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1334 _cleanup_free_ char *e = NULL;
1335 char *m = NULL, *c = NULL;
1340 /* Let's see if we shall enter some container */
1341 m = strchr(host, ':');
1345 /* Let's make sure this is not a port of some kind,
1346 * and is a valid machine name. */
1347 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1350 /* Cut out the host part */
1351 t = strndupa(host, m - host - 1);
1352 e = bus_address_escape(t);
1356 c = strjoina(",argv4=--machine=", m);
1361 e = bus_address_escape(host);
1366 b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e, ",argv3=systemd-stdio-bridge", c, NULL);
1373 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1377 assert_return(host, -EINVAL);
1378 assert_return(ret, -EINVAL);
1380 r = sd_bus_new(&bus);
1384 r = bus_set_address_system_remote(bus, host);
1388 bus->bus_client = true;
1389 bus->trusted = false;
1390 bus->is_system = true;
1392 r = sd_bus_start(bus);
1404 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1405 _cleanup_free_ char *e = NULL;
1410 e = bus_address_escape(machine);
1414 b->address = strjoin("x-machine-kernel:machine=", e, ";x-machine-unix:machine=", e, NULL);
1421 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1425 assert_return(machine, -EINVAL);
1426 assert_return(ret, -EINVAL);
1427 assert_return(machine_name_is_valid(machine), -EINVAL);
1429 r = sd_bus_new(&bus);
1433 r = bus_set_address_system_machine(bus, machine);
1437 bus->bus_client = true;
1438 bus->trusted = false;
1439 bus->is_system = true;
1441 r = sd_bus_start(bus);
1453 _public_ void sd_bus_close(sd_bus *bus) {
1457 if (bus->state == BUS_CLOSED)
1459 if (bus_pid_changed(bus))
1462 bus->state = BUS_CLOSED;
1464 sd_bus_detach_event(bus);
1466 /* Drop all queued messages so that they drop references to
1467 * the bus object and the bus may be freed */
1468 bus_reset_queues(bus);
1470 if (!bus->is_kernel)
1473 /* We'll leave the fd open in case this is a kernel bus, since
1474 * there might still be memblocks around that reference this
1475 * bus, and they might need to invoke the KDBUS_CMD_FREE
1476 * ioctl on the fd when they are freed. */
1479 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1487 return sd_bus_unref(bus);
1490 static void bus_enter_closing(sd_bus *bus) {
1493 if (bus->state != BUS_OPENING &&
1494 bus->state != BUS_AUTHENTICATING &&
1495 bus->state != BUS_HELLO &&
1496 bus->state != BUS_RUNNING)
1499 bus->state = BUS_CLOSING;
1502 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1503 assert_return(bus, NULL);
1505 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1510 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1516 i = REFCNT_DEC(bus->n_ref);
1524 /// UNNEEDED by elogind
1526 _public_ int sd_bus_is_open(sd_bus *bus) {
1528 assert_return(bus, -EINVAL);
1529 assert_return(!bus_pid_changed(bus), -ECHILD);
1531 return BUS_IS_OPEN(bus->state);
1535 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1538 assert_return(bus, -EINVAL);
1539 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1540 assert_return(!bus_pid_changed(bus), -ECHILD);
1542 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
1545 if (type == SD_BUS_TYPE_UNIX_FD) {
1546 if (!(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD))
1549 r = bus_ensure_running(bus);
1553 return bus->can_fds;
1556 return bus_type_is_valid(type);
1559 /// UNNEEDED by elogind
1561 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1564 assert_return(bus, -EINVAL);
1565 assert_return(id, -EINVAL);
1566 assert_return(!bus_pid_changed(bus), -ECHILD);
1568 r = bus_ensure_running(bus);
1572 *id = bus->server_id;
1577 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1582 /* If we copy the same message to multiple
1583 * destinations, avoid using the same cookie
1585 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1590 timeout = BUS_DEFAULT_TIMEOUT;
1592 return bus_message_seal(m, ++b->cookie, timeout);
1595 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1596 bool remarshal = false;
1600 /* wrong packet version */
1601 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1604 /* wrong packet endianness */
1605 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1608 /* TODO: kdbus-messages received from the kernel contain data which is
1609 * not allowed to be passed to KDBUS_CMD_SEND. Therefore, we have to
1610 * force remarshaling of the message. Technically, we could just
1611 * recreate the kdbus message, but that is non-trivial as other parts of
1612 * the message refer to m->kdbus already. This should be fixed! */
1613 if ((*m)->kdbus && (*m)->release_kdbus)
1616 return remarshal ? bus_message_remarshal(b, m) : 0;
1619 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1623 /* Fake some timestamps, if they were requested, and not
1624 * already initialized */
1625 if (b->attach_flags & KDBUS_ATTACH_TIMESTAMP) {
1626 if (m->realtime <= 0)
1627 m->realtime = now(CLOCK_REALTIME);
1629 if (m->monotonic <= 0)
1630 m->monotonic = now(CLOCK_MONOTONIC);
1633 /* The bus specification says the serial number cannot be 0,
1634 * hence let's fill something in for synthetic messages. Since
1635 * synthetic messages might have a fake sender and we don't
1636 * want to interfere with the real sender's serial numbers we
1637 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1638 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1639 * even though kdbus can do 64bit. */
1640 return bus_message_seal(m, 0xFFFFFFFFULL, 0);
1643 static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
1650 r = bus_kernel_write_message(bus, m, hint_sync_call);
1652 r = bus_socket_write_message(bus, m, idx);
1657 if (bus->is_kernel || *idx >= BUS_MESSAGE_SIZE(m))
1658 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
1659 bus_message_type_to_string(m->header->type),
1660 strna(sd_bus_message_get_sender(m)),
1661 strna(sd_bus_message_get_destination(m)),
1662 strna(sd_bus_message_get_path(m)),
1663 strna(sd_bus_message_get_interface(m)),
1664 strna(sd_bus_message_get_member(m)),
1665 BUS_MESSAGE_COOKIE(m),
1667 strna(m->error.message));
1672 static int dispatch_wqueue(sd_bus *bus) {
1676 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1678 while (bus->wqueue_size > 0) {
1680 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
1684 /* Didn't do anything this time */
1686 else if (bus->is_kernel || bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1687 /* Fully written. Let's drop the entry from
1690 * This isn't particularly optimized, but
1691 * well, this is supposed to be our worst-case
1692 * buffer only, and the socket buffer is
1693 * supposed to be our primary buffer, and if
1694 * it got full, then all bets are off
1697 bus->wqueue_size --;
1698 sd_bus_message_unref(bus->wqueue[0]);
1699 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1709 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1713 return bus_kernel_read_message(bus, hint_priority, priority);
1715 return bus_socket_read_message(bus);
1718 int bus_rqueue_make_room(sd_bus *bus) {
1721 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1724 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1730 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1735 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1737 /* Note that the priority logic is only available on kdbus,
1738 * where the rqueue is unused. We check the rqueue here
1739 * anyway, because it's simple... */
1742 if (bus->rqueue_size > 0) {
1743 /* Dispatch a queued message */
1745 *m = bus->rqueue[0];
1746 bus->rqueue_size --;
1747 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1751 /* Try to read a new message */
1752 r = bus_read_message(bus, hint_priority, priority);
1762 static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
1763 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1766 assert_return(m, -EINVAL);
1771 assert_return(!bus_pid_changed(bus), -ECHILD);
1772 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1774 if (!BUS_IS_OPEN(bus->state))
1778 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1785 /* If the cookie number isn't kept, then we know that no reply
1787 if (!cookie && !m->sealed)
1788 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1790 r = bus_seal_message(bus, m, 0);
1794 /* Remarshall if we have to. This will possibly unref the
1795 * message and place a replacement in m */
1796 r = bus_remarshal_message(bus, &m);
1800 /* If this is a reply and no reply was requested, then let's
1801 * suppress this, if we can */
1805 if ((bus->state == BUS_RUNNING || bus->state == BUS_HELLO) && bus->wqueue_size <= 0) {
1808 r = bus_write_message(bus, m, hint_sync_call, &idx);
1810 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1811 bus_enter_closing(bus);
1818 if (!bus->is_kernel && idx < BUS_MESSAGE_SIZE(m)) {
1819 /* Wasn't fully written. So let's remember how
1820 * much was written. Note that the first entry
1821 * of the wqueue array is always allocated so
1822 * that we always can remember how much was
1824 bus->wqueue[0] = sd_bus_message_ref(m);
1825 bus->wqueue_size = 1;
1830 /* Just append it to the queue. */
1832 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1835 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1838 bus->wqueue[bus->wqueue_size ++] = sd_bus_message_ref(m);
1843 *cookie = BUS_MESSAGE_COOKIE(m);
1848 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1849 return bus_send_internal(bus, m, cookie, false);
1852 /// UNNEEDED by elogind
1854 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1857 assert_return(m, -EINVAL);
1862 assert_return(!bus_pid_changed(bus), -ECHILD);
1864 if (!BUS_IS_OPEN(bus->state))
1867 if (!streq_ptr(m->destination, destination)) {
1872 r = sd_bus_message_set_destination(m, destination);
1877 return sd_bus_send(bus, m, cookie);
1881 static usec_t calc_elapse(uint64_t usec) {
1882 if (usec == (uint64_t) -1)
1885 return now(CLOCK_MONOTONIC) + usec;
1888 static int timeout_compare(const void *a, const void *b) {
1889 const struct reply_callback *x = a, *y = b;
1891 if (x->timeout != 0 && y->timeout == 0)
1894 if (x->timeout == 0 && y->timeout != 0)
1897 if (x->timeout < y->timeout)
1900 if (x->timeout > y->timeout)
1906 _public_ int sd_bus_call_async(
1910 sd_bus_message_handler_t callback,
1914 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1915 _cleanup_bus_slot_unref_ sd_bus_slot *s = NULL;
1918 assert_return(m, -EINVAL);
1919 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1920 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1921 assert_return(callback, -EINVAL);
1926 assert_return(!bus_pid_changed(bus), -ECHILD);
1927 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1929 if (!BUS_IS_OPEN(bus->state))
1932 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
1936 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1940 r = bus_seal_message(bus, m, usec);
1944 r = bus_remarshal_message(bus, &m);
1948 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
1952 s->reply_callback.callback = callback;
1954 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
1955 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
1957 s->reply_callback.cookie = 0;
1961 s->reply_callback.timeout = calc_elapse(m->timeout);
1962 if (s->reply_callback.timeout != 0) {
1963 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
1965 s->reply_callback.timeout = 0;
1970 r = sd_bus_send(bus, m, &s->reply_callback.cookie);
1981 int bus_ensure_running(sd_bus *bus) {
1986 if (bus->state == BUS_UNSET || bus->state == BUS_CLOSED || bus->state == BUS_CLOSING)
1988 if (bus->state == BUS_RUNNING)
1992 r = sd_bus_process(bus, NULL);
1995 if (bus->state == BUS_RUNNING)
2000 r = sd_bus_wait(bus, (uint64_t) -1);
2006 _public_ int sd_bus_call(
2010 sd_bus_error *error,
2011 sd_bus_message **reply) {
2013 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
2019 bus_assert_return(m, -EINVAL, error);
2020 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
2021 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
2022 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
2027 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
2028 bus_assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS, error);
2030 if (!BUS_IS_OPEN(bus->state)) {
2035 r = bus_ensure_running(bus);
2039 i = bus->rqueue_size;
2041 r = bus_seal_message(bus, m, usec);
2045 r = bus_remarshal_message(bus, &m);
2049 r = bus_send_internal(bus, m, &cookie, true);
2053 timeout = calc_elapse(m->timeout);
2058 while (i < bus->rqueue_size) {
2059 sd_bus_message *incoming = NULL;
2061 incoming = bus->rqueue[i];
2063 if (incoming->reply_cookie == cookie) {
2064 /* Found a match! */
2066 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2068 log_debug_bus_message(incoming);
2070 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2072 if (incoming->n_fds <= 0 || (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2076 sd_bus_message_unref(incoming);
2081 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2082 sd_bus_message_unref(incoming);
2085 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
2086 r = sd_bus_error_copy(error, &incoming->error);
2087 sd_bus_message_unref(incoming);
2094 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2097 streq(bus->unique_name, incoming->sender)) {
2099 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2102 /* Our own message? Somebody is trying
2103 * to send its own client a message,
2104 * let's not dead-lock, let's fail
2107 sd_bus_message_unref(incoming);
2112 /* Try to read more, right-away */
2116 r = bus_read_message(bus, false, 0);
2118 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2119 bus_enter_closing(bus);
2131 n = now(CLOCK_MONOTONIC);
2139 left = (uint64_t) -1;
2141 r = bus_poll(bus, true, left);
2149 r = dispatch_wqueue(bus);
2151 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2152 bus_enter_closing(bus);
2161 return sd_bus_error_set_errno(error, r);
2164 /// UNNEEDED by elogind
2166 _public_ int sd_bus_get_fd(sd_bus *bus) {
2168 assert_return(bus, -EINVAL);
2169 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2170 assert_return(!bus_pid_changed(bus), -ECHILD);
2172 return bus->input_fd;
2176 _public_ int sd_bus_get_events(sd_bus *bus) {
2179 assert_return(bus, -EINVAL);
2180 assert_return(!bus_pid_changed(bus), -ECHILD);
2182 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2185 if (bus->state == BUS_OPENING)
2187 else if (bus->state == BUS_AUTHENTICATING) {
2189 if (bus_socket_auth_needs_write(bus))
2194 } else if (bus->state == BUS_RUNNING || bus->state == BUS_HELLO) {
2195 if (bus->rqueue_size <= 0)
2197 if (bus->wqueue_size > 0)
2204 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2205 struct reply_callback *c;
2207 assert_return(bus, -EINVAL);
2208 assert_return(timeout_usec, -EINVAL);
2209 assert_return(!bus_pid_changed(bus), -ECHILD);
2211 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2214 if (bus->track_queue) {
2219 if (bus->state == BUS_CLOSING) {
2224 if (bus->state == BUS_AUTHENTICATING) {
2225 *timeout_usec = bus->auth_timeout;
2229 if (bus->state != BUS_RUNNING && bus->state != BUS_HELLO) {
2230 *timeout_usec = (uint64_t) -1;
2234 if (bus->rqueue_size > 0) {
2239 c = prioq_peek(bus->reply_callbacks_prioq);
2241 *timeout_usec = (uint64_t) -1;
2245 if (c->timeout == 0) {
2246 *timeout_usec = (uint64_t) -1;
2250 *timeout_usec = c->timeout;
2254 static int process_timeout(sd_bus *bus) {
2255 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2256 _cleanup_bus_message_unref_ sd_bus_message* m = NULL;
2257 struct reply_callback *c;
2264 c = prioq_peek(bus->reply_callbacks_prioq);
2268 n = now(CLOCK_MONOTONIC);
2272 r = bus_message_new_synthetic_error(
2275 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2280 r = bus_seal_synthetic_message(bus, m);
2284 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2287 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2290 slot = container_of(c, sd_bus_slot, reply_callback);
2292 bus->iteration_counter ++;
2294 bus->current_message = m;
2295 bus->current_slot = sd_bus_slot_ref(slot);
2296 bus->current_handler = c->callback;
2297 bus->current_userdata = slot->userdata;
2298 r = c->callback(m, slot->userdata, &error_buffer);
2299 bus->current_userdata = NULL;
2300 bus->current_handler = NULL;
2301 bus->current_slot = NULL;
2302 bus->current_message = NULL;
2304 if (slot->floating) {
2305 bus_slot_disconnect(slot);
2306 sd_bus_slot_unref(slot);
2309 sd_bus_slot_unref(slot);
2311 return bus_maybe_reply_error(m, r, &error_buffer);
2314 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2318 if (bus->state != BUS_HELLO)
2321 /* Let's make sure the first message on the bus is the HELLO
2322 * reply. But note that we don't actually parse the message
2323 * here (we leave that to the usual handling), we just verify
2324 * we don't let any earlier msg through. */
2326 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2327 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2330 if (m->reply_cookie != 1)
2336 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2337 _cleanup_bus_message_unref_ sd_bus_message *synthetic_reply = NULL;
2338 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2339 struct reply_callback *c;
2346 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2347 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2350 if (bus->is_kernel && (bus->hello_flags & KDBUS_HELLO_MONITOR))
2353 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2356 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2362 slot = container_of(c, sd_bus_slot, reply_callback);
2364 if (m->n_fds > 0 && !(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2366 /* If the reply contained a file descriptor which we
2367 * didn't want we pass an error instead. */
2369 r = bus_message_new_synthetic_error(
2372 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2377 /* Copy over original timestamp */
2378 synthetic_reply->realtime = m->realtime;
2379 synthetic_reply->monotonic = m->monotonic;
2380 synthetic_reply->seqnum = m->seqnum;
2382 r = bus_seal_synthetic_message(bus, synthetic_reply);
2386 m = synthetic_reply;
2388 r = sd_bus_message_rewind(m, true);
2393 if (c->timeout != 0) {
2394 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2398 bus->current_slot = sd_bus_slot_ref(slot);
2399 bus->current_handler = c->callback;
2400 bus->current_userdata = slot->userdata;
2401 r = c->callback(m, slot->userdata, &error_buffer);
2402 bus->current_userdata = NULL;
2403 bus->current_handler = NULL;
2404 bus->current_slot = NULL;
2406 if (slot->floating) {
2407 bus_slot_disconnect(slot);
2408 sd_bus_slot_unref(slot);
2411 sd_bus_slot_unref(slot);
2413 return bus_maybe_reply_error(m, r, &error_buffer);
2416 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2417 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2418 struct filter_callback *l;
2425 bus->filter_callbacks_modified = false;
2427 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2430 if (bus->filter_callbacks_modified)
2433 /* Don't run this more than once per iteration */
2434 if (l->last_iteration == bus->iteration_counter)
2437 l->last_iteration = bus->iteration_counter;
2439 r = sd_bus_message_rewind(m, true);
2443 slot = container_of(l, sd_bus_slot, filter_callback);
2445 bus->current_slot = sd_bus_slot_ref(slot);
2446 bus->current_handler = l->callback;
2447 bus->current_userdata = slot->userdata;
2448 r = l->callback(m, slot->userdata, &error_buffer);
2449 bus->current_userdata = NULL;
2450 bus->current_handler = NULL;
2451 bus->current_slot = sd_bus_slot_unref(slot);
2453 r = bus_maybe_reply_error(m, r, &error_buffer);
2459 } while (bus->filter_callbacks_modified);
2464 static int process_match(sd_bus *bus, sd_bus_message *m) {
2471 bus->match_callbacks_modified = false;
2473 r = bus_match_run(bus, &bus->match_callbacks, m);
2477 } while (bus->match_callbacks_modified);
2482 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2483 _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
2489 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2492 if (bus->manual_peer_interface)
2495 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2498 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2501 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2504 if (streq_ptr(m->member, "Ping"))
2505 r = sd_bus_message_new_method_return(m, &reply);
2506 else if (streq_ptr(m->member, "GetMachineId")) {
2510 r = sd_id128_get_machine(&id);
2514 r = sd_bus_message_new_method_return(m, &reply);
2518 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2520 r = sd_bus_message_new_method_errorf(
2522 SD_BUS_ERROR_UNKNOWN_METHOD,
2523 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2529 r = sd_bus_send(bus, reply, NULL);
2536 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2540 /* If we got a message with a file descriptor which we didn't
2541 * want to accept, then let's drop it. How can this even
2542 * happen? For example, when the kernel queues a message into
2543 * an activatable names's queue which allows fds, and then is
2544 * delivered to us later even though we ourselves did not
2547 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2553 if (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)
2556 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2557 return 1; /* just eat it up */
2559 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2562 static int process_message(sd_bus *bus, sd_bus_message *m) {
2568 bus->current_message = m;
2569 bus->iteration_counter++;
2571 log_debug_bus_message(m);
2573 r = process_hello(bus, m);
2577 r = process_reply(bus, m);
2581 r = process_fd_check(bus, m);
2585 r = process_filter(bus, m);
2589 r = process_match(bus, m);
2593 r = process_builtin(bus, m);
2597 r = bus_process_object(bus, m);
2600 bus->current_message = NULL;
2604 static int dispatch_track(sd_bus *bus) {
2607 if (!bus->track_queue)
2610 bus_track_dispatch(bus->track_queue);
2614 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2615 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2619 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
2621 r = process_timeout(bus);
2625 r = dispatch_wqueue(bus);
2629 r = dispatch_track(bus);
2633 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2639 r = process_message(bus, m);
2644 r = sd_bus_message_rewind(m, true);
2653 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2655 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2656 strna(sd_bus_message_get_sender(m)),
2657 strna(sd_bus_message_get_path(m)),
2658 strna(sd_bus_message_get_interface(m)),
2659 strna(sd_bus_message_get_member(m)));
2661 r = sd_bus_reply_method_errorf(
2663 SD_BUS_ERROR_UNKNOWN_OBJECT,
2664 "Unknown object '%s'.", m->path);
2678 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2679 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2680 struct reply_callback *c;
2684 assert(bus->state == BUS_CLOSING);
2686 c = ordered_hashmap_first(bus->reply_callbacks);
2688 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2691 /* First, fail all outstanding method calls */
2692 r = bus_message_new_synthetic_error(
2695 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2700 r = bus_seal_synthetic_message(bus, m);
2704 if (c->timeout != 0) {
2705 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2709 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2712 slot = container_of(c, sd_bus_slot, reply_callback);
2714 bus->iteration_counter++;
2716 bus->current_message = m;
2717 bus->current_slot = sd_bus_slot_ref(slot);
2718 bus->current_handler = c->callback;
2719 bus->current_userdata = slot->userdata;
2720 r = c->callback(m, slot->userdata, &error_buffer);
2721 bus->current_userdata = NULL;
2722 bus->current_handler = NULL;
2723 bus->current_slot = NULL;
2724 bus->current_message = NULL;
2726 if (slot->floating) {
2727 bus_slot_disconnect(slot);
2728 sd_bus_slot_unref(slot);
2731 sd_bus_slot_unref(slot);
2733 return bus_maybe_reply_error(m, r, &error_buffer);
2736 /* Then, synthesize a Disconnected message */
2737 r = sd_bus_message_new_signal(
2740 "/org/freedesktop/DBus/Local",
2741 "org.freedesktop.DBus.Local",
2746 bus_message_set_sender_local(bus, m);
2748 r = bus_seal_synthetic_message(bus, m);
2754 bus->current_message = m;
2755 bus->iteration_counter++;
2757 r = process_filter(bus, m);
2761 r = process_match(bus, m);
2773 bus->current_message = NULL;
2778 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2779 BUS_DONT_DESTROY(bus);
2782 /* Returns 0 when we didn't do anything. This should cause the
2783 * caller to invoke sd_bus_wait() before returning the next
2784 * time. Returns > 0 when we did something, which possibly
2785 * means *ret is filled in with an unprocessed message. */
2787 assert_return(bus, -EINVAL);
2788 assert_return(!bus_pid_changed(bus), -ECHILD);
2790 /* We don't allow recursively invoking sd_bus_process(). */
2791 assert_return(!bus->current_message, -EBUSY);
2792 assert(!bus->current_slot);
2794 switch (bus->state) {
2803 r = bus_socket_process_opening(bus);
2804 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2805 bus_enter_closing(bus);
2813 case BUS_AUTHENTICATING:
2814 r = bus_socket_process_authenticating(bus);
2815 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2816 bus_enter_closing(bus);
2828 r = process_running(bus, hint_priority, priority, ret);
2829 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2830 bus_enter_closing(bus);
2840 return process_closing(bus, ret);
2843 assert_not_reached("Unknown state");
2846 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2847 return bus_process_internal(bus, false, 0, ret);
2850 /// UNNEEDED by elogind
2852 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2853 return bus_process_internal(bus, true, priority, ret);
2857 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2858 struct pollfd p[2] = {};
2861 usec_t m = USEC_INFINITY;
2865 if (bus->state == BUS_CLOSING)
2868 if (!BUS_IS_OPEN(bus->state))
2871 e = sd_bus_get_events(bus);
2876 /* The caller really needs some more data, he doesn't
2877 * care about what's already read, or any timeouts
2878 * except its own. */
2882 /* The caller wants to process if there's something to
2883 * process, but doesn't care otherwise */
2885 r = sd_bus_get_timeout(bus, &until);
2890 nw = now(CLOCK_MONOTONIC);
2891 m = until > nw ? until - nw : 0;
2895 if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
2898 p[0].fd = bus->input_fd;
2899 if (bus->output_fd == bus->input_fd) {
2903 p[0].events = e & POLLIN;
2904 p[1].fd = bus->output_fd;
2905 p[1].events = e & POLLOUT;
2909 r = ppoll(p, n, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
2913 return r > 0 ? 1 : 0;
2916 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2918 assert_return(bus, -EINVAL);
2919 assert_return(!bus_pid_changed(bus), -ECHILD);
2921 if (bus->state == BUS_CLOSING)
2924 if (!BUS_IS_OPEN(bus->state))
2927 if (bus->rqueue_size > 0)
2930 return bus_poll(bus, false, timeout_usec);
2933 _public_ int sd_bus_flush(sd_bus *bus) {
2936 assert_return(bus, -EINVAL);
2937 assert_return(!bus_pid_changed(bus), -ECHILD);
2939 if (bus->state == BUS_CLOSING)
2942 if (!BUS_IS_OPEN(bus->state))
2945 r = bus_ensure_running(bus);
2949 if (bus->wqueue_size <= 0)
2953 r = dispatch_wqueue(bus);
2955 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2956 bus_enter_closing(bus);
2963 if (bus->wqueue_size <= 0)
2966 r = bus_poll(bus, false, (uint64_t) -1);
2972 /// UNNEEDED by elogind
2974 _public_ int sd_bus_add_filter(
2977 sd_bus_message_handler_t callback,
2982 assert_return(bus, -EINVAL);
2983 assert_return(callback, -EINVAL);
2984 assert_return(!bus_pid_changed(bus), -ECHILD);
2986 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
2990 s->filter_callback.callback = callback;
2992 bus->filter_callbacks_modified = true;
2993 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
3002 _public_ int sd_bus_add_match(
3006 sd_bus_message_handler_t callback,
3009 struct bus_match_component *components = NULL;
3010 unsigned n_components = 0;
3011 sd_bus_slot *s = NULL;
3014 assert_return(bus, -EINVAL);
3015 assert_return(match, -EINVAL);
3016 assert_return(!bus_pid_changed(bus), -ECHILD);
3018 r = bus_match_parse(match, &components, &n_components);
3022 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
3028 s->match_callback.callback = callback;
3029 s->match_callback.cookie = ++bus->match_cookie;
3031 if (bus->bus_client) {
3032 enum bus_match_scope scope;
3034 scope = bus_match_get_scope(components, n_components);
3036 /* Do not install server-side matches for matches
3037 * against the local service, interface or bus
3039 if (scope != BUS_MATCH_LOCAL) {
3041 if (!bus->is_kernel) {
3042 /* When this is not a kernel transport, we
3043 * store the original match string, so that we
3044 * can use it to remove the match again */
3046 s->match_callback.match_string = strdup(match);
3047 if (!s->match_callback.match_string) {
3053 r = bus_add_match_internal(bus, s->match_callback.match_string, components, n_components, s->match_callback.cookie);
3057 s->match_added = true;
3061 bus->match_callbacks_modified = true;
3062 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3071 bus_match_parse_free(components, n_components);
3072 sd_bus_slot_unref(s);
3077 /// UNNEEDED by elogind
3079 int bus_remove_match_by_string(
3082 sd_bus_message_handler_t callback,
3085 struct bus_match_component *components = NULL;
3086 unsigned n_components = 0;
3087 struct match_callback *c;
3090 assert_return(bus, -EINVAL);
3091 assert_return(match, -EINVAL);
3092 assert_return(!bus_pid_changed(bus), -ECHILD);
3094 r = bus_match_parse(match, &components, &n_components);
3098 r = bus_match_find(&bus->match_callbacks, components, n_components, NULL, NULL, &c);
3102 sd_bus_slot_unref(container_of(c, sd_bus_slot, match_callback));
3105 bus_match_parse_free(components, n_components);
3111 bool bus_pid_changed(sd_bus *bus) {
3114 /* We don't support people creating a bus connection and
3115 * keeping it around over a fork(). Let's complain. */
3117 return bus->original_pid != getpid();
3120 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3121 sd_bus *bus = userdata;
3126 r = sd_bus_process(bus, NULL);
3133 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3134 sd_bus *bus = userdata;
3139 r = sd_bus_process(bus, NULL);
3146 static int prepare_callback(sd_event_source *s, void *userdata) {
3147 sd_bus *bus = userdata;
3154 e = sd_bus_get_events(bus);
3158 if (bus->output_fd != bus->input_fd) {
3160 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3164 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3168 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3173 r = sd_bus_get_timeout(bus, &until);
3179 j = sd_event_source_set_time(bus->time_event_source, until);
3184 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3191 static int quit_callback(sd_event_source *event, void *userdata) {
3192 sd_bus *bus = userdata;
3202 static int attach_io_events(sd_bus *bus) {
3207 if (bus->input_fd < 0)
3213 if (!bus->input_io_event_source) {
3214 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3218 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3222 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3226 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3228 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3233 if (bus->output_fd != bus->input_fd) {
3234 assert(bus->output_fd >= 0);
3236 if (!bus->output_io_event_source) {
3237 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3241 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3245 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3247 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3256 static void detach_io_events(sd_bus *bus) {
3259 if (bus->input_io_event_source) {
3260 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3261 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3264 if (bus->output_io_event_source) {
3265 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3266 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3270 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3273 assert_return(bus, -EINVAL);
3274 assert_return(!bus->event, -EBUSY);
3276 assert(!bus->input_io_event_source);
3277 assert(!bus->output_io_event_source);
3278 assert(!bus->time_event_source);
3281 bus->event = sd_event_ref(event);
3283 r = sd_event_default(&bus->event);
3288 bus->event_priority = priority;
3290 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3294 r = sd_event_source_set_priority(bus->time_event_source, priority);
3298 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3302 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3306 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3310 r = attach_io_events(bus);
3317 sd_bus_detach_event(bus);
3321 _public_ int sd_bus_detach_event(sd_bus *bus) {
3322 assert_return(bus, -EINVAL);
3327 detach_io_events(bus);
3329 if (bus->time_event_source) {
3330 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3331 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3334 if (bus->quit_event_source) {
3335 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3336 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3339 bus->event = sd_event_unref(bus->event);
3343 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3344 assert_return(bus, NULL);
3349 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3350 assert_return(bus, NULL);
3352 return bus->current_message;
3355 /// UNNEEDED by elogind
3357 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3358 assert_return(bus, NULL);
3360 return bus->current_slot;
3364 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3365 assert_return(bus, NULL);
3367 return bus->current_handler;
3370 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3371 assert_return(bus, NULL);
3373 return bus->current_userdata;
3376 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3381 assert(default_bus);
3384 return !!*default_bus;
3387 *ret = sd_bus_ref(*default_bus);
3395 b->default_bus_ptr = default_bus;
3403 _public_ int sd_bus_default_system(sd_bus **ret) {
3404 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3408 _public_ int sd_bus_default_user(sd_bus **ret) {
3409 /// elogind does not support user buses
3411 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3413 return sd_bus_default_system(ret);
3417 _public_ int sd_bus_default(sd_bus **ret) {
3421 /* Let's try our best to reuse another cached connection. If
3422 * the starter bus type is set, connect via our normal
3423 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3424 * we can share the connection with the user/system default
3427 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3429 if (streq(e, "system"))
3430 return sd_bus_default_system(ret);
3431 /// elogind does not support systemd units
3433 else if (STR_IN_SET(e, "user", "session"))
3434 return sd_bus_default_user(ret);
3438 /* No type is specified, so we have not other option than to
3439 * use the starter address if it is set. */
3441 e = secure_getenv("DBUS_STARTER_ADDRESS");
3444 return bus_default(sd_bus_open, &default_starter_bus, ret);
3447 /* Finally, if nothing is set use the cached connection for
3448 * the right scope */
3450 /// elogind does not support systemd units
3452 if (cg_pid_get_owner_uid(0, NULL) >= 0)
3453 return sd_bus_default_user(ret);
3456 return sd_bus_default_system(ret);
3459 /// UNNEEDED by elogind
3461 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3462 assert_return(b, -EINVAL);
3463 assert_return(tid, -EINVAL);
3464 assert_return(!bus_pid_changed(b), -ECHILD);
3472 return sd_event_get_tid(b->event, tid);
3477 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3478 _cleanup_free_ char *e = NULL;
3481 assert_return(object_path_is_valid(prefix), -EINVAL);
3482 assert_return(external_id, -EINVAL);
3483 assert_return(ret_path, -EINVAL);
3485 e = bus_label_escape(external_id);
3489 ret = strjoin(prefix, "/", e, NULL);
3497 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3501 assert_return(object_path_is_valid(path), -EINVAL);
3502 assert_return(object_path_is_valid(prefix), -EINVAL);
3503 assert_return(external_id, -EINVAL);
3505 e = object_path_startswith(path, prefix);
3507 *external_id = NULL;
3511 ret = bus_label_unescape(e);
3519 _public_ int sd_bus_path_encode_many(char **out, const char *path_template, ...) {
3520 _cleanup_strv_free_ char **labels = NULL;
3521 char *path, *path_pos, **label_pos;
3522 const char *sep, *template_pos;
3527 assert_return(out, -EINVAL);
3528 assert_return(path_template, -EINVAL);
3530 path_length = strlen(path_template);
3532 va_start(list, path_template);
3533 for (sep = strchr(path_template, '%'); sep; sep = strchr(sep + 1, '%')) {
3537 arg = va_arg(list, const char *);
3543 label = bus_label_escape(arg);
3549 r = strv_consume(&labels, label);
3555 /* add label length, but account for the format character */
3556 path_length += strlen(label) - 1;
3560 path = malloc(path_length + 1);
3567 for (template_pos = path_template; *template_pos; ) {
3568 sep = strchrnul(template_pos, '%');
3569 path_pos = mempcpy(path_pos, template_pos, sep - template_pos);
3573 path_pos = stpcpy(path_pos, *label_pos++);
3574 template_pos = sep + 1;
3582 _public_ int sd_bus_path_decode_many(const char *path, const char *path_template, ...) {
3583 _cleanup_strv_free_ char **labels = NULL;
3584 const char *template_pos, *path_pos;
3590 * This decodes an object-path based on a template argument. The
3591 * template consists of a verbatim path, optionally including special
3594 * - Each occurrence of '%' in the template matches an arbitrary
3595 * substring of a label in the given path. At most one such
3596 * directive is allowed per label. For each such directive, the
3597 * caller must provide an output parameter (char **) via va_arg. If
3598 * NULL is passed, the given label is verified, but not returned.
3599 * For each matched label, the *decoded* label is stored in the
3600 * passed output argument, and the caller is responsible to free
3601 * it. Note that the output arguments are only modified if the
3602 * actualy path matched the template. Otherwise, they're left
3605 * This function returns <0 on error, 0 if the path does not match the
3606 * template, 1 if it matched.
3609 assert_return(path, -EINVAL);
3610 assert_return(path_template, -EINVAL);
3614 for (template_pos = path_template; *template_pos; ) {
3619 /* verify everything until the next '%' matches verbatim */
3620 sep = strchrnul(template_pos, '%');
3621 length = sep - template_pos;
3622 if (strncmp(path_pos, template_pos, length))
3626 template_pos += length;
3631 /* We found the next '%' character. Everything up until here
3632 * matched. We now skip ahead to the end of this label and make
3633 * sure it matches the tail of the label in the path. Then we
3634 * decode the string in-between and save it for later use. */
3636 ++template_pos; /* skip over '%' */
3638 sep = strchrnul(template_pos, '/');
3639 length = sep - template_pos; /* length of suffix to match verbatim */
3641 /* verify the suffixes match */
3642 sep = strchrnul(path_pos, '/');
3643 if (sep - path_pos < (ssize_t)length ||
3644 strncmp(sep - length, template_pos, length))
3647 template_pos += length; /* skip over matched label */
3648 length = sep - path_pos - length; /* length of sub-label to decode */
3650 /* store unescaped label for later use */
3651 label = bus_label_unescape_n(path_pos, length);
3655 r = strv_consume(&labels, label);
3659 path_pos = sep; /* skip decoded label and suffix */
3662 /* end of template must match end of path */
3666 /* copy the labels over to the caller */
3667 va_start(list, path_template);
3668 for (label_pos = labels; label_pos && *label_pos; ++label_pos) {
3671 arg = va_arg(list, char **);
3684 _public_ int sd_bus_try_close(sd_bus *bus) {
3687 assert_return(bus, -EINVAL);
3688 assert_return(!bus_pid_changed(bus), -ECHILD);
3690 if (!bus->is_kernel)
3693 if (!BUS_IS_OPEN(bus->state))
3696 if (bus->rqueue_size > 0)
3699 if (bus->wqueue_size > 0)
3702 r = bus_kernel_try_close(bus);
3710 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3711 assert_return(bus, -EINVAL);
3712 assert_return(description, -EINVAL);
3713 assert_return(bus->description, -ENXIO);
3714 assert_return(!bus_pid_changed(bus), -ECHILD);
3716 *description = bus->description;
3721 int bus_get_root_path(sd_bus *bus) {
3724 if (bus->cgroup_root)
3727 r = cg_get_root_path(&bus->cgroup_root);
3729 bus->cgroup_root = strdup("/");
3730 if (!bus->cgroup_root)
3739 /// UNNEEDED by elogind
3741 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3744 assert_return(bus, -EINVAL);
3745 assert_return(scope, -EINVAL);
3746 assert_return(!bus_pid_changed(bus), -ECHILD);
3748 if (bus->is_kernel) {
3749 _cleanup_free_ char *n = NULL;
3752 r = bus_kernel_get_bus_name(bus, &n);
3756 if (streq(n, "0-system")) {
3761 dash = strchr(n, '-');
3762 if (streq_ptr(dash, "-user")) {
3773 if (bus->is_system) {
3781 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3783 assert_return(bus, -EINVAL);
3784 assert_return(address, -EINVAL);
3785 assert_return(!bus_pid_changed(bus), -ECHILD);
3788 *address = bus->address;
3795 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
3796 assert_return(bus, -EINVAL);
3797 assert_return(mask, -EINVAL);
3798 assert_return(!bus_pid_changed(bus), -ECHILD);
3800 *mask = bus->creds_mask;
3804 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
3805 assert_return(bus, -EINVAL);
3806 assert_return(!bus_pid_changed(bus), -ECHILD);
3808 return bus->bus_client;
3811 _public_ int sd_bus_is_server(sd_bus *bus) {
3812 assert_return(bus, -EINVAL);
3813 assert_return(!bus_pid_changed(bus), -ECHILD);
3815 return bus->is_server;
3818 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
3819 assert_return(bus, -EINVAL);
3820 assert_return(!bus_pid_changed(bus), -ECHILD);
3822 return bus->anonymous_auth;
3825 _public_ int sd_bus_is_trusted(sd_bus *bus) {
3826 assert_return(bus, -EINVAL);
3827 assert_return(!bus_pid_changed(bus), -ECHILD);
3829 return bus->trusted;
3832 _public_ int sd_bus_is_monitor(sd_bus *bus) {
3833 assert_return(bus, -EINVAL);
3834 assert_return(!bus_pid_changed(bus), -ECHILD);
3836 return !!(bus->hello_flags & KDBUS_HELLO_MONITOR);
3839 static void flush_close(sd_bus *bus) {
3843 /* Flushes and closes the specified bus. We take a ref before,
3844 * to ensure the flushing does not cause the bus to be
3847 sd_bus_flush_close_unref(sd_bus_ref(bus));
3850 _public_ void sd_bus_default_flush_close(void) {
3851 flush_close(default_starter_bus);
3852 flush_close(default_user_bus);
3853 flush_close(default_system_bus);