1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2013 Lennart Poettering
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
31 #include "alloc-util.h"
32 #include "bus-container.h"
33 #include "bus-control.h"
34 #include "bus-internal.h"
35 #include "bus-kernel.h"
36 #include "bus-label.h"
37 #include "bus-message.h"
38 #include "bus-objects.h"
39 #include "bus-protocol.h"
41 #include "bus-socket.h"
42 #include "bus-track.h"
45 #include "cgroup-util.h"
48 #include "hexdecoct.h"
49 #include "hostname-util.h"
52 #include "parse-util.h"
53 #include "string-util.h"
57 /// Additional includes needed by elogind
58 #include "process-util.h"
60 #define log_debug_bus_message(m) \
62 sd_bus_message *_mm = (m); \
63 log_debug("Got message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " signature=%s error-name=%s error-message=%s", \
64 bus_message_type_to_string(_mm->header->type), \
65 strna(sd_bus_message_get_sender(_mm)), \
66 strna(sd_bus_message_get_destination(_mm)), \
67 strna(sd_bus_message_get_path(_mm)), \
68 strna(sd_bus_message_get_interface(_mm)), \
69 strna(sd_bus_message_get_member(_mm)), \
70 BUS_MESSAGE_COOKIE(_mm), \
72 strna(_mm->root_container.signature), \
73 strna(_mm->error.name), \
74 strna(_mm->error.message)); \
77 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
78 static void bus_detach_io_events(sd_bus *b);
79 static void bus_detach_inotify_event(sd_bus *b);
81 static thread_local sd_bus *default_system_bus = NULL;
82 #if 0 /// UNNEEDED by elogind
83 static thread_local sd_bus *default_user_bus = NULL;
85 static thread_local sd_bus *default_starter_bus = NULL;
87 void bus_close_io_fds(sd_bus *b) {
90 bus_detach_io_events(b);
92 if (b->input_fd != b->output_fd)
93 safe_close(b->output_fd);
94 b->output_fd = b->input_fd = safe_close(b->input_fd);
97 void bus_close_inotify_fd(sd_bus *b) {
100 bus_detach_inotify_event(b);
102 b->inotify_fd = safe_close(b->inotify_fd);
103 b->inotify_watches = mfree(b->inotify_watches);
104 b->n_inotify_watches = 0;
107 static void bus_reset_queues(sd_bus *b) {
110 while (b->rqueue_size > 0)
111 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
113 b->rqueue = mfree(b->rqueue);
114 b->rqueue_allocated = 0;
116 while (b->wqueue_size > 0)
117 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
119 b->wqueue = mfree(b->wqueue);
120 b->wqueue_allocated = 0;
123 static void bus_free(sd_bus *b) {
127 assert(!b->track_queue);
130 b->state = BUS_CLOSED;
132 sd_bus_detach_event(b);
134 while ((s = b->slots)) {
135 /* At this point only floating slots can still be
136 * around, because the non-floating ones keep a
137 * reference to the bus, and we thus couldn't be
138 * destructing right now... We forcibly disconnect the
139 * slots here, so that they still can be referenced by
140 * apps, but are dead. */
143 bus_slot_disconnect(s);
144 sd_bus_slot_unref(s);
147 if (b->default_bus_ptr)
148 *b->default_bus_ptr = NULL;
151 bus_close_inotify_fd(b);
156 free(b->unique_name);
157 free(b->auth_buffer);
160 free(b->cgroup_root);
161 free(b->description);
164 strv_free(b->exec_argv);
166 close_many(b->fds, b->n_fds);
171 ordered_hashmap_free_free(b->reply_callbacks);
172 prioq_free(b->reply_callbacks_prioq);
174 assert(b->match_callbacks.type == BUS_MATCH_ROOT);
175 bus_match_free(&b->match_callbacks);
177 hashmap_free_free(b->vtable_methods);
178 hashmap_free_free(b->vtable_properties);
180 assert(hashmap_isempty(b->nodes));
181 hashmap_free(b->nodes);
185 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
190 _public_ int sd_bus_new(sd_bus **ret) {
193 assert_return(ret, -EINVAL);
199 r->n_ref = REFCNT_INIT;
200 r->input_fd = r->output_fd = -1;
202 r->message_version = 1;
203 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
204 r->hello_flags |= KDBUS_HELLO_ACCEPT_FD;
205 r->attach_flags |= KDBUS_ATTACH_NAMES;
206 r->original_pid = getpid_cached();
207 r->n_groups = (size_t) -1;
209 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
211 /* We guarantee that wqueue always has space for at least one
213 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
222 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
225 assert_return(bus, -EINVAL);
226 assert_return(bus->state == BUS_UNSET, -EPERM);
227 assert_return(address, -EINVAL);
228 assert_return(!bus_pid_changed(bus), -ECHILD);
240 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
241 assert_return(bus, -EINVAL);
242 assert_return(bus->state == BUS_UNSET, -EPERM);
243 assert_return(input_fd >= 0, -EBADF);
244 assert_return(output_fd >= 0, -EBADF);
245 assert_return(!bus_pid_changed(bus), -ECHILD);
247 bus->input_fd = input_fd;
248 bus->output_fd = output_fd;
252 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
255 assert_return(bus, -EINVAL);
256 assert_return(bus->state == BUS_UNSET, -EPERM);
257 assert_return(path, -EINVAL);
258 assert_return(!strv_isempty(argv), -EINVAL);
259 assert_return(!bus_pid_changed(bus), -ECHILD);
271 free(bus->exec_path);
272 strv_free(bus->exec_argv);
280 _public_ int sd_bus_set_bus_client(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 bus->bus_client = !!b;
289 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
290 assert_return(bus, -EINVAL);
291 assert_return(bus->state == BUS_UNSET, -EPERM);
292 assert_return(!bus_pid_changed(bus), -ECHILD);
294 SET_FLAG(bus->hello_flags, KDBUS_HELLO_MONITOR, b);
298 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
299 assert_return(bus, -EINVAL);
300 assert_return(bus->state == BUS_UNSET, -EPERM);
301 assert_return(!bus_pid_changed(bus), -ECHILD);
303 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ACCEPT_FD, b);
307 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
309 assert_return(bus, -EINVAL);
310 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
311 assert_return(!bus_pid_changed(bus), -ECHILD);
313 new_flags = bus->attach_flags;
314 SET_FLAG(new_flags, KDBUS_ATTACH_TIMESTAMP, b);
316 if (bus->attach_flags == new_flags)
319 bus->attach_flags = new_flags;
324 _public_ int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t mask) {
327 assert_return(bus, -EINVAL);
328 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
329 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
330 assert_return(!bus_pid_changed(bus), -ECHILD);
332 SET_FLAG(bus->creds_mask, mask, b);
334 /* The well knowns we need unconditionally, so that matches can work */
335 bus->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
337 /* Make sure we don't lose the timestamp flag */
338 new_flags = (bus->attach_flags & KDBUS_ATTACH_TIMESTAMP) | attach_flags_to_kdbus(bus->creds_mask);
339 if (bus->attach_flags == new_flags)
342 bus->attach_flags = new_flags;
347 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
348 assert_return(bus, -EINVAL);
349 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
350 assert_return(bus->state == BUS_UNSET, -EPERM);
351 assert_return(!bus_pid_changed(bus), -ECHILD);
353 bus->is_server = !!b;
354 bus->server_id = server_id;
358 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
359 assert_return(bus, -EINVAL);
360 assert_return(bus->state == BUS_UNSET, -EPERM);
361 assert_return(!bus_pid_changed(bus), -ECHILD);
363 bus->anonymous_auth = !!b;
367 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
368 assert_return(bus, -EINVAL);
369 assert_return(bus->state == BUS_UNSET, -EPERM);
370 assert_return(!bus_pid_changed(bus), -ECHILD);
376 _public_ int sd_bus_set_description(sd_bus *bus, const char *description) {
377 assert_return(bus, -EINVAL);
378 assert_return(bus->state == BUS_UNSET, -EPERM);
379 assert_return(!bus_pid_changed(bus), -ECHILD);
381 return free_and_strdup(&bus->description, description);
384 _public_ int sd_bus_set_allow_interactive_authorization(sd_bus *bus, int b) {
385 assert_return(bus, -EINVAL);
386 assert_return(!bus_pid_changed(bus), -ECHILD);
388 bus->allow_interactive_authorization = !!b;
392 _public_ int sd_bus_get_allow_interactive_authorization(sd_bus *bus) {
393 assert_return(bus, -EINVAL);
394 assert_return(!bus_pid_changed(bus), -ECHILD);
396 return bus->allow_interactive_authorization;
399 _public_ int sd_bus_set_watch_bind(sd_bus *bus, int b) {
400 assert_return(bus, -EINVAL);
401 assert_return(bus->state == BUS_UNSET, -EPERM);
402 assert_return(!bus_pid_changed(bus), -ECHILD);
408 _public_ int sd_bus_get_watch_bind(sd_bus *bus) {
409 assert_return(bus, -EINVAL);
410 assert_return(!bus_pid_changed(bus), -ECHILD);
412 return bus->watch_bind;
415 static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) {
423 assert(IN_SET(bus->state, BUS_HELLO, BUS_CLOSING));
425 r = sd_bus_message_get_errno(reply);
429 r = sd_bus_message_read(reply, "s", &s);
433 if (!service_name_is_valid(s) || s[0] != ':')
436 bus->unique_name = strdup(s);
437 if (!bus->unique_name)
440 if (bus->state == BUS_HELLO)
441 bus->state = BUS_RUNNING;
446 static int bus_send_hello(sd_bus *bus) {
447 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
452 if (!bus->bus_client)
455 r = sd_bus_message_new_method_call(
458 "org.freedesktop.DBus",
459 "/org/freedesktop/DBus",
460 "org.freedesktop.DBus",
465 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
468 int bus_start_running(sd_bus *bus) {
469 struct reply_callback *c;
474 assert(bus->state < BUS_HELLO);
476 /* We start all method call timeouts when we enter BUS_HELLO or BUS_RUNNING mode. At this point let's convert
477 * all relative to absolute timestamps. Note that we do not reshuffle the reply callback priority queue since
478 * adding a fixed value to all entries should not alter the internal order. */
480 n = now(CLOCK_MONOTONIC);
481 ORDERED_HASHMAP_FOREACH(c, bus->reply_callbacks, i) {
482 if (c->timeout_usec == 0)
485 c->timeout_usec = usec_add(n, c->timeout_usec);
488 if (bus->bus_client) {
489 bus->state = BUS_HELLO;
493 bus->state = BUS_RUNNING;
497 static int parse_address_key(const char **p, const char *key, char **value) {
498 size_t l, n = 0, allocated = 0;
508 if (strncmp(*p, key, l) != 0)
521 while (!IN_SET(*a, ';', ',', 0)) {
539 c = (char) ((x << 4) | y);
546 if (!GREEDY_REALLOC(r, allocated, n + 2))
570 static void skip_address_key(const char **p) {
574 *p += strcspn(*p, ",");
580 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
581 _cleanup_free_ char *path = NULL, *abstract = NULL;
590 while (!IN_SET(**p, 0, ';')) {
591 r = parse_address_key(p, "guid", guid);
597 r = parse_address_key(p, "path", &path);
603 r = parse_address_key(p, "abstract", &abstract);
612 if (!path && !abstract)
615 if (path && abstract)
620 if (l > sizeof(b->sockaddr.un.sun_path))
623 b->sockaddr.un.sun_family = AF_UNIX;
624 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
625 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
626 } else if (abstract) {
627 l = strlen(abstract);
628 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
631 b->sockaddr.un.sun_family = AF_UNIX;
632 b->sockaddr.un.sun_path[0] = 0;
633 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
634 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
642 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
643 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
645 struct addrinfo *result, hints = {
646 .ai_socktype = SOCK_STREAM,
647 .ai_flags = AI_ADDRCONFIG,
655 while (!IN_SET(**p, 0, ';')) {
656 r = parse_address_key(p, "guid", guid);
662 r = parse_address_key(p, "host", &host);
668 r = parse_address_key(p, "port", &port);
674 r = parse_address_key(p, "family", &family);
687 if (streq(family, "ipv4"))
688 hints.ai_family = AF_INET;
689 else if (streq(family, "ipv6"))
690 hints.ai_family = AF_INET6;
695 r = getaddrinfo(host, port, &hints, &result);
699 return -EADDRNOTAVAIL;
701 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
702 b->sockaddr_size = result->ai_addrlen;
704 freeaddrinfo(result);
711 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
713 unsigned n_argv = 0, j;
715 size_t allocated = 0;
723 while (!IN_SET(**p, 0, ';')) {
724 r = parse_address_key(p, "guid", guid);
730 r = parse_address_key(p, "path", &path);
736 if (startswith(*p, "argv")) {
740 ul = strtoul(*p + 4, (char**) p, 10);
741 if (errno > 0 || **p != '=' || ul > 256) {
749 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
757 r = parse_address_key(p, NULL, argv + ul);
772 /* Make sure there are no holes in the array, with the
773 * exception of argv[0] */
774 for (j = 1; j < n_argv; j++)
780 if (argv && argv[0] == NULL) {
781 argv[0] = strdup(path);
796 for (j = 0; j < n_argv; j++)
804 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
805 _cleanup_free_ char *machine = NULL, *pid = NULL;
813 while (!IN_SET(**p, 0, ';')) {
814 r = parse_address_key(p, "guid", guid);
820 r = parse_address_key(p, "machine", &machine);
826 r = parse_address_key(p, "pid", &pid);
835 if (!machine == !pid)
839 if (!machine_name_is_valid(machine))
842 free_and_replace(b->machine, machine);
844 b->machine = mfree(b->machine);
848 r = parse_pid(pid, &b->nspid);
854 b->sockaddr.un.sun_family = AF_UNIX;
855 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
856 b->sockaddr_size = SOCKADDR_UN_LEN(b->sockaddr.un);
862 static void bus_reset_parsed_address(sd_bus *b) {
866 b->sockaddr_size = 0;
867 b->exec_argv = strv_free(b->exec_argv);
868 b->exec_path = mfree(b->exec_path);
869 b->server_id = SD_ID128_NULL;
870 b->machine = mfree(b->machine);
874 static int bus_parse_next_address(sd_bus *b) {
875 _cleanup_free_ char *guid = NULL;
883 if (b->address[b->address_index] == 0)
886 bus_reset_parsed_address(b);
888 a = b->address + b->address_index;
897 if (startswith(a, "unix:")) {
900 r = parse_unix_address(b, &a, &guid);
905 } else if (startswith(a, "tcp:")) {
908 r = parse_tcp_address(b, &a, &guid);
914 } else if (startswith(a, "unixexec:")) {
917 r = parse_exec_address(b, &a, &guid);
923 } else if (startswith(a, "x-machine-unix:")) {
926 r = parse_container_unix_address(b, &a, &guid);
939 r = sd_id128_from_string(guid, &b->server_id);
944 b->address_index = a - b->address;
948 static int bus_start_address(sd_bus *b) {
955 bus_close_inotify_fd(b);
957 /* If you provide multiple different bus-addresses, we
958 * try all of them in order and use the first one that
962 r = bus_socket_exec(b);
963 else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC)
964 r = bus_container_connect_socket(b);
965 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
966 r = bus_socket_connect(b);
973 q = bus_attach_io_events(b);
977 q = bus_attach_inotify_event(b);
984 b->last_connect_error = -r;
987 r = bus_parse_next_address(b);
991 return b->last_connect_error > 0 ? -b->last_connect_error : -ECONNREFUSED;
995 int bus_next_address(sd_bus *b) {
998 bus_reset_parsed_address(b);
999 return bus_start_address(b);
1002 static int bus_start_fd(sd_bus *b) {
1007 assert(b->input_fd >= 0);
1008 assert(b->output_fd >= 0);
1010 r = fd_nonblock(b->input_fd, true);
1014 r = fd_cloexec(b->input_fd, true);
1018 if (b->input_fd != b->output_fd) {
1019 r = fd_nonblock(b->output_fd, true);
1023 r = fd_cloexec(b->output_fd, true);
1028 if (fstat(b->input_fd, &st) < 0)
1031 return bus_socket_take_fd(b);
1034 _public_ int sd_bus_start(sd_bus *bus) {
1037 assert_return(bus, -EINVAL);
1038 assert_return(bus->state == BUS_UNSET, -EPERM);
1039 assert_return(!bus_pid_changed(bus), -ECHILD);
1041 bus->state = BUS_OPENING;
1043 if (bus->is_server && bus->bus_client)
1046 if (bus->input_fd >= 0)
1047 r = bus_start_fd(bus);
1048 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->machine)
1049 r = bus_start_address(bus);
1058 return bus_send_hello(bus);
1061 _public_ int sd_bus_open(sd_bus **ret) {
1066 assert_return(ret, -EINVAL);
1068 /* Let's connect to the starter bus if it is set, and
1069 * otherwise to the bus that is appropropriate for the scope
1070 * we are running in */
1072 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1074 if (streq(e, "system"))
1075 return sd_bus_open_system(ret);
1076 #if 0 /// elogind does not support systemd user instances
1077 else if (STR_IN_SET(e, "session", "user"))
1078 return sd_bus_open_user(ret);
1082 e = secure_getenv("DBUS_STARTER_ADDRESS");
1084 #if 0 /// elogind does not support systemd user instances
1085 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1086 return sd_bus_open_user(ret);
1089 return sd_bus_open_system(ret);
1096 r = sd_bus_set_address(b, e);
1100 b->bus_client = true;
1102 /* We don't know whether the bus is trusted or not, so better
1103 * be safe, and authenticate everything */
1105 b->is_local = false;
1106 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1107 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1109 r = sd_bus_start(b);
1121 int bus_set_address_system(sd_bus *b) {
1125 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1127 return sd_bus_set_address(b, e);
1129 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1132 _public_ int sd_bus_open_system(sd_bus **ret) {
1136 assert_return(ret, -EINVAL);
1142 r = bus_set_address_system(b);
1146 b->bus_client = true;
1147 b->is_system = true;
1149 /* Let's do per-method access control on the system bus. We
1150 * need the caller's UID and capability set for that. */
1152 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1153 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1156 r = sd_bus_start(b);
1168 #if 0 /// elogind can not open/use a user bus
1169 int bus_set_address_user(sd_bus *b) {
1171 _cleanup_free_ char *ee = NULL, *s = NULL;
1175 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1177 return sd_bus_set_address(b, e);
1179 e = secure_getenv("XDG_RUNTIME_DIR");
1183 ee = bus_address_escape(e);
1187 if (asprintf(&s, UNIX_USER_BUS_ADDRESS_FMT, ee) < 0)
1197 _public_ int sd_bus_open_user(sd_bus **ret) {
1198 #if 0 /// elogind does not support user buses
1202 assert_return(ret, -EINVAL);
1208 r = bus_set_address_user(b);
1212 b->bus_client = true;
1215 /* We don't do any per-method access control on the user
1220 r = sd_bus_start(b);
1231 return sd_bus_open_system(ret);
1235 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1236 _cleanup_free_ char *e = NULL;
1237 char *m = NULL, *c = NULL;
1242 /* Let's see if we shall enter some container */
1243 m = strchr(host, ':');
1247 /* Let's make sure this is not a port of some kind,
1248 * and is a valid machine name. */
1249 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1252 /* Cut out the host part */
1253 t = strndupa(host, m - host - 1);
1254 e = bus_address_escape(t);
1258 c = strjoina(",argv5=--machine=", m);
1263 e = bus_address_escape(host);
1268 b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e, ",argv4=systemd-stdio-bridge", c);
1275 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1279 assert_return(host, -EINVAL);
1280 assert_return(ret, -EINVAL);
1282 r = sd_bus_new(&bus);
1286 r = bus_set_address_system_remote(bus, host);
1290 bus->bus_client = true;
1291 bus->trusted = false;
1292 bus->is_system = true;
1293 bus->is_local = false;
1295 r = sd_bus_start(bus);
1307 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1308 _cleanup_free_ char *e = NULL;
1313 e = bus_address_escape(machine);
1317 b->address = strjoin("x-machine-unix:machine=", e);
1324 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1328 assert_return(machine, -EINVAL);
1329 assert_return(ret, -EINVAL);
1330 assert_return(machine_name_is_valid(machine), -EINVAL);
1332 r = sd_bus_new(&bus);
1336 r = bus_set_address_system_machine(bus, machine);
1340 bus->bus_client = true;
1341 bus->trusted = false;
1342 bus->is_system = true;
1343 bus->is_local = false;
1345 r = sd_bus_start(bus);
1357 _public_ void sd_bus_close(sd_bus *bus) {
1361 if (bus->state == BUS_CLOSED)
1363 if (bus_pid_changed(bus))
1366 bus->state = BUS_CLOSED;
1368 sd_bus_detach_event(bus);
1370 /* Drop all queued messages so that they drop references to
1371 * the bus object and the bus may be freed */
1372 bus_reset_queues(bus);
1374 bus_close_io_fds(bus);
1375 bus_close_inotify_fd(bus);
1378 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1386 return sd_bus_unref(bus);
1389 static void bus_enter_closing(sd_bus *bus) {
1392 if (!IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING, BUS_HELLO, BUS_RUNNING))
1395 bus->state = BUS_CLOSING;
1398 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1403 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1408 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1414 i = REFCNT_DEC(bus->n_ref);
1422 _public_ int sd_bus_is_open(sd_bus *bus) {
1424 assert_return(bus, -EINVAL);
1425 assert_return(!bus_pid_changed(bus), -ECHILD);
1427 return BUS_IS_OPEN(bus->state);
1430 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1433 assert_return(bus, -EINVAL);
1434 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1435 assert_return(!bus_pid_changed(bus), -ECHILD);
1437 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
1440 if (type == SD_BUS_TYPE_UNIX_FD) {
1441 if (!(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD))
1444 r = bus_ensure_running(bus);
1448 return bus->can_fds;
1451 return bus_type_is_valid(type);
1454 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1457 assert_return(bus, -EINVAL);
1458 assert_return(id, -EINVAL);
1459 assert_return(!bus_pid_changed(bus), -ECHILD);
1461 r = bus_ensure_running(bus);
1465 *id = bus->server_id;
1469 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1474 /* If we copy the same message to multiple
1475 * destinations, avoid using the same cookie
1477 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1482 timeout = BUS_DEFAULT_TIMEOUT;
1484 return sd_bus_message_seal(m, ++b->cookie, timeout);
1487 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1488 bool remarshal = false;
1492 /* wrong packet version */
1493 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1496 /* wrong packet endianness */
1497 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1500 return remarshal ? bus_message_remarshal(b, m) : 0;
1503 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1507 /* Fake some timestamps, if they were requested, and not
1508 * already initialized */
1509 if (b->attach_flags & KDBUS_ATTACH_TIMESTAMP) {
1510 if (m->realtime <= 0)
1511 m->realtime = now(CLOCK_REALTIME);
1513 if (m->monotonic <= 0)
1514 m->monotonic = now(CLOCK_MONOTONIC);
1517 /* The bus specification says the serial number cannot be 0,
1518 * hence let's fill something in for synthetic messages. Since
1519 * synthetic messages might have a fake sender and we don't
1520 * want to interfere with the real sender's serial numbers we
1521 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1522 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1523 * even though kdbus can do 64bit. */
1524 return sd_bus_message_seal(m, 0xFFFFFFFFULL, 0);
1527 static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
1533 r = bus_socket_write_message(bus, m, idx);
1537 if (*idx >= BUS_MESSAGE_SIZE(m))
1538 log_debug("Sent message type=%s sender=%s destination=%s path=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " signature=%s error-name=%s error-message=%s",
1539 bus_message_type_to_string(m->header->type),
1540 strna(sd_bus_message_get_sender(m)),
1541 strna(sd_bus_message_get_destination(m)),
1542 strna(sd_bus_message_get_path(m)),
1543 strna(sd_bus_message_get_interface(m)),
1544 strna(sd_bus_message_get_member(m)),
1545 BUS_MESSAGE_COOKIE(m),
1547 strna(m->root_container.signature),
1548 strna(m->error.name),
1549 strna(m->error.message));
1554 static int dispatch_wqueue(sd_bus *bus) {
1558 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1560 while (bus->wqueue_size > 0) {
1562 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
1566 /* Didn't do anything this time */
1568 else if (bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1569 /* Fully written. Let's drop the entry from
1572 * This isn't particularly optimized, but
1573 * well, this is supposed to be our worst-case
1574 * buffer only, and the socket buffer is
1575 * supposed to be our primary buffer, and if
1576 * it got full, then all bets are off
1580 sd_bus_message_unref(bus->wqueue[0]);
1581 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1591 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1594 return bus_socket_read_message(bus);
1597 int bus_rqueue_make_room(sd_bus *bus) {
1600 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1603 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1609 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1614 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1616 /* Note that the priority logic is only available on kdbus,
1617 * where the rqueue is unused. We check the rqueue here
1618 * anyway, because it's simple... */
1621 if (bus->rqueue_size > 0) {
1622 /* Dispatch a queued message */
1624 *m = bus->rqueue[0];
1626 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1630 /* Try to read a new message */
1631 r = bus_read_message(bus, hint_priority, priority);
1641 static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
1642 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1645 assert_return(m, -EINVAL);
1650 assert_return(!bus_pid_changed(bus), -ECHILD);
1652 if (!BUS_IS_OPEN(bus->state))
1656 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1663 /* If the cookie number isn't kept, then we know that no reply
1665 if (!cookie && !m->sealed)
1666 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1668 r = bus_seal_message(bus, m, 0);
1672 /* Remarshall if we have to. This will possibly unref the
1673 * message and place a replacement in m */
1674 r = bus_remarshal_message(bus, &m);
1678 /* If this is a reply and no reply was requested, then let's
1679 * suppress this, if we can */
1683 if (IN_SET(bus->state, BUS_RUNNING, BUS_HELLO) && bus->wqueue_size <= 0) {
1686 r = bus_write_message(bus, m, hint_sync_call, &idx);
1688 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
1689 bus_enter_closing(bus);
1696 if (idx < BUS_MESSAGE_SIZE(m)) {
1697 /* Wasn't fully written. So let's remember how
1698 * much was written. Note that the first entry
1699 * of the wqueue array is always allocated so
1700 * that we always can remember how much was
1702 bus->wqueue[0] = sd_bus_message_ref(m);
1703 bus->wqueue_size = 1;
1708 /* Just append it to the queue. */
1710 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1713 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1716 bus->wqueue[bus->wqueue_size++] = sd_bus_message_ref(m);
1721 *cookie = BUS_MESSAGE_COOKIE(m);
1726 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1727 return bus_send_internal(bus, m, cookie, false);
1730 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1733 assert_return(m, -EINVAL);
1738 assert_return(!bus_pid_changed(bus), -ECHILD);
1740 if (!BUS_IS_OPEN(bus->state))
1743 if (!streq_ptr(m->destination, destination)) {
1748 r = sd_bus_message_set_destination(m, destination);
1753 return sd_bus_send(bus, m, cookie);
1756 static usec_t calc_elapse(sd_bus *bus, uint64_t usec) {
1759 if (usec == (uint64_t) -1)
1762 /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
1763 * with any connection setup states. Hence, if a method callback is started earlier than that we just store the
1764 * relative timestamp, and afterwards the absolute one. */
1766 if (IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING))
1769 return now(CLOCK_MONOTONIC) + usec;
1772 static int timeout_compare(const void *a, const void *b) {
1773 const struct reply_callback *x = a, *y = b;
1775 if (x->timeout_usec != 0 && y->timeout_usec == 0)
1778 if (x->timeout_usec == 0 && y->timeout_usec != 0)
1781 if (x->timeout_usec < y->timeout_usec)
1784 if (x->timeout_usec > y->timeout_usec)
1790 _public_ int sd_bus_call_async(
1794 sd_bus_message_handler_t callback,
1798 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1799 _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *s = NULL;
1802 assert_return(m, -EINVAL);
1803 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1804 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1805 assert_return(callback, -EINVAL);
1810 assert_return(!bus_pid_changed(bus), -ECHILD);
1812 if (!BUS_IS_OPEN(bus->state))
1815 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
1819 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1823 r = bus_seal_message(bus, m, usec);
1827 r = bus_remarshal_message(bus, &m);
1831 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
1835 s->reply_callback.callback = callback;
1837 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
1838 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
1840 s->reply_callback.cookie = 0;
1844 s->reply_callback.timeout_usec = calc_elapse(bus, m->timeout);
1845 if (s->reply_callback.timeout_usec != 0) {
1846 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
1848 s->reply_callback.timeout_usec = 0;
1853 r = sd_bus_send(bus, m, &s->reply_callback.cookie);
1864 int bus_ensure_running(sd_bus *bus) {
1869 if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
1871 if (bus->state == BUS_RUNNING)
1875 r = sd_bus_process(bus, NULL);
1878 if (bus->state == BUS_RUNNING)
1883 r = sd_bus_wait(bus, (uint64_t) -1);
1889 _public_ int sd_bus_call(
1893 sd_bus_error *error,
1894 sd_bus_message **reply) {
1896 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1902 bus_assert_return(m, -EINVAL, error);
1903 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
1904 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
1905 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
1910 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
1912 if (!BUS_IS_OPEN(bus->state)) {
1917 r = bus_ensure_running(bus);
1921 i = bus->rqueue_size;
1923 r = bus_seal_message(bus, m, usec);
1927 r = bus_remarshal_message(bus, &m);
1931 r = bus_send_internal(bus, m, &cookie, true);
1935 timeout = calc_elapse(bus, m->timeout);
1940 while (i < bus->rqueue_size) {
1941 sd_bus_message *incoming = NULL;
1943 incoming = bus->rqueue[i];
1945 if (incoming->reply_cookie == cookie) {
1946 /* Found a match! */
1948 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1950 log_debug_bus_message(incoming);
1952 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
1954 if (incoming->n_fds <= 0 || (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
1958 sd_bus_message_unref(incoming);
1963 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
1964 sd_bus_message_unref(incoming);
1967 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
1968 r = sd_bus_error_copy(error, &incoming->error);
1969 sd_bus_message_unref(incoming);
1976 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
1979 streq(bus->unique_name, incoming->sender)) {
1981 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1984 /* Our own message? Somebody is trying
1985 * to send its own client a message,
1986 * let's not dead-lock, let's fail
1989 sd_bus_message_unref(incoming);
1994 /* Try to read more, right-away */
1998 r = bus_read_message(bus, false, 0);
2000 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2001 bus_enter_closing(bus);
2013 n = now(CLOCK_MONOTONIC);
2021 left = (uint64_t) -1;
2023 r = bus_poll(bus, true, left);
2031 r = dispatch_wqueue(bus);
2033 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2034 bus_enter_closing(bus);
2043 return sd_bus_error_set_errno(error, r);
2046 _public_ int sd_bus_get_fd(sd_bus *bus) {
2048 assert_return(bus, -EINVAL);
2049 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2050 assert_return(!bus_pid_changed(bus), -ECHILD);
2052 if (bus->state == BUS_CLOSED)
2055 if (bus->inotify_fd >= 0)
2056 return bus->inotify_fd;
2058 if (bus->input_fd >= 0)
2059 return bus->input_fd;
2064 _public_ int sd_bus_get_events(sd_bus *bus) {
2067 assert_return(bus, -EINVAL);
2068 assert_return(!bus_pid_changed(bus), -ECHILD);
2070 switch (bus->state) {
2076 case BUS_WATCH_BIND:
2084 case BUS_AUTHENTICATING:
2085 if (bus_socket_auth_needs_write(bus))
2093 if (bus->rqueue_size <= 0)
2095 if (bus->wqueue_size > 0)
2103 assert_not_reached("Unknown state");
2109 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2110 struct reply_callback *c;
2112 assert_return(bus, -EINVAL);
2113 assert_return(timeout_usec, -EINVAL);
2114 assert_return(!bus_pid_changed(bus), -ECHILD);
2116 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2119 if (bus->track_queue) {
2124 switch (bus->state) {
2126 case BUS_AUTHENTICATING:
2127 *timeout_usec = bus->auth_timeout;
2132 if (bus->rqueue_size > 0) {
2137 c = prioq_peek(bus->reply_callbacks_prioq);
2139 *timeout_usec = (uint64_t) -1;
2143 if (c->timeout_usec == 0) {
2144 *timeout_usec = (uint64_t) -1;
2148 *timeout_usec = c->timeout_usec;
2155 case BUS_WATCH_BIND:
2157 *timeout_usec = (uint64_t) -1;
2161 assert_not_reached("Unknown or unexpected stat");
2165 static int process_timeout(sd_bus *bus) {
2166 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2167 _cleanup_(sd_bus_message_unrefp) sd_bus_message* m = NULL;
2168 struct reply_callback *c;
2175 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2177 c = prioq_peek(bus->reply_callbacks_prioq);
2181 n = now(CLOCK_MONOTONIC);
2182 if (c->timeout_usec > n)
2185 r = bus_message_new_synthetic_error(
2188 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2193 r = bus_seal_synthetic_message(bus, m);
2197 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2198 c->timeout_usec = 0;
2200 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2203 slot = container_of(c, sd_bus_slot, reply_callback);
2205 bus->iteration_counter++;
2207 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2209 bus->current_message = m;
2210 bus->current_slot = sd_bus_slot_ref(slot);
2211 bus->current_handler = c->callback;
2212 bus->current_userdata = slot->userdata;
2213 r = c->callback(m, slot->userdata, &error_buffer);
2214 bus->current_userdata = NULL;
2215 bus->current_handler = NULL;
2216 bus->current_slot = NULL;
2217 bus->current_message = NULL;
2219 if (slot->floating) {
2220 bus_slot_disconnect(slot);
2221 sd_bus_slot_unref(slot);
2224 sd_bus_slot_unref(slot);
2226 /* When this is the hello message and it timed out, then make sure to propagate the error up, don't just log
2227 * and ignore the callback handler's return value. */
2231 return bus_maybe_reply_error(m, r, &error_buffer);
2234 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2238 if (bus->state != BUS_HELLO)
2241 /* Let's make sure the first message on the bus is the HELLO
2242 * reply. But note that we don't actually parse the message
2243 * here (we leave that to the usual handling), we just verify
2244 * we don't let any earlier msg through. */
2246 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2249 if (m->reply_cookie != 1)
2255 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2256 _cleanup_(sd_bus_message_unrefp) sd_bus_message *synthetic_reply = NULL;
2257 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2258 struct reply_callback *c;
2266 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2269 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2272 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2278 slot = container_of(c, sd_bus_slot, reply_callback);
2280 if (m->n_fds > 0 && !(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2282 /* If the reply contained a file descriptor which we
2283 * didn't want we pass an error instead. */
2285 r = bus_message_new_synthetic_error(
2288 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2293 /* Copy over original timestamp */
2294 synthetic_reply->realtime = m->realtime;
2295 synthetic_reply->monotonic = m->monotonic;
2296 synthetic_reply->seqnum = m->seqnum;
2298 r = bus_seal_synthetic_message(bus, synthetic_reply);
2302 m = synthetic_reply;
2304 r = sd_bus_message_rewind(m, true);
2309 if (c->timeout_usec != 0) {
2310 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2311 c->timeout_usec = 0;
2314 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2316 bus->current_slot = sd_bus_slot_ref(slot);
2317 bus->current_handler = c->callback;
2318 bus->current_userdata = slot->userdata;
2319 r = c->callback(m, slot->userdata, &error_buffer);
2320 bus->current_userdata = NULL;
2321 bus->current_handler = NULL;
2322 bus->current_slot = NULL;
2324 if (slot->floating) {
2325 bus_slot_disconnect(slot);
2326 sd_bus_slot_unref(slot);
2329 sd_bus_slot_unref(slot);
2331 /* When this is the hello message and it failed, then make sure to propagate the error up, don't just log and
2332 * ignore the callback handler's return value. */
2336 return bus_maybe_reply_error(m, r, &error_buffer);
2339 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2340 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2341 struct filter_callback *l;
2348 bus->filter_callbacks_modified = false;
2350 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2353 if (bus->filter_callbacks_modified)
2356 /* Don't run this more than once per iteration */
2357 if (l->last_iteration == bus->iteration_counter)
2360 l->last_iteration = bus->iteration_counter;
2362 r = sd_bus_message_rewind(m, true);
2366 slot = container_of(l, sd_bus_slot, filter_callback);
2368 bus->current_slot = sd_bus_slot_ref(slot);
2369 bus->current_handler = l->callback;
2370 bus->current_userdata = slot->userdata;
2371 r = l->callback(m, slot->userdata, &error_buffer);
2372 bus->current_userdata = NULL;
2373 bus->current_handler = NULL;
2374 bus->current_slot = sd_bus_slot_unref(slot);
2376 r = bus_maybe_reply_error(m, r, &error_buffer);
2382 } while (bus->filter_callbacks_modified);
2387 static int process_match(sd_bus *bus, sd_bus_message *m) {
2394 bus->match_callbacks_modified = false;
2396 r = bus_match_run(bus, &bus->match_callbacks, m);
2400 } while (bus->match_callbacks_modified);
2405 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2406 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
2412 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2415 if (bus->manual_peer_interface)
2418 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2421 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2424 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2427 if (streq_ptr(m->member, "Ping"))
2428 r = sd_bus_message_new_method_return(m, &reply);
2429 else if (streq_ptr(m->member, "GetMachineId")) {
2433 r = sd_id128_get_machine(&id);
2437 r = sd_bus_message_new_method_return(m, &reply);
2441 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2443 r = sd_bus_message_new_method_errorf(
2445 SD_BUS_ERROR_UNKNOWN_METHOD,
2446 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2452 r = sd_bus_send(bus, reply, NULL);
2459 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2463 /* If we got a message with a file descriptor which we didn't
2464 * want to accept, then let's drop it. How can this even
2465 * happen? For example, when the kernel queues a message into
2466 * an activatable names's queue which allows fds, and then is
2467 * delivered to us later even though we ourselves did not
2470 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2476 if (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)
2479 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2480 return 1; /* just eat it up */
2482 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2485 static int process_message(sd_bus *bus, sd_bus_message *m) {
2491 bus->current_message = m;
2492 bus->iteration_counter++;
2494 log_debug_bus_message(m);
2496 r = process_hello(bus, m);
2500 r = process_reply(bus, m);
2504 r = process_fd_check(bus, m);
2508 r = process_filter(bus, m);
2512 r = process_match(bus, m);
2516 r = process_builtin(bus, m);
2520 r = bus_process_object(bus, m);
2523 bus->current_message = NULL;
2527 static int dispatch_track(sd_bus *bus) {
2530 if (!bus->track_queue)
2533 bus_track_dispatch(bus->track_queue);
2537 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2538 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2542 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2544 r = process_timeout(bus);
2548 r = dispatch_wqueue(bus);
2552 r = dispatch_track(bus);
2556 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2562 r = process_message(bus, m);
2567 r = sd_bus_message_rewind(m, true);
2576 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2578 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2579 strna(sd_bus_message_get_sender(m)),
2580 strna(sd_bus_message_get_path(m)),
2581 strna(sd_bus_message_get_interface(m)),
2582 strna(sd_bus_message_get_member(m)));
2584 r = sd_bus_reply_method_errorf(
2586 SD_BUS_ERROR_UNKNOWN_OBJECT,
2587 "Unknown object '%s'.", m->path);
2601 static int bus_exit_now(sd_bus *bus) {
2604 /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
2605 * sd_event_exit(), otherwise invokes libc exit(). */
2607 if (bus->exited) /* did we already exit? */
2609 if (!bus->exit_triggered) /* was the exit condition triggered? */
2611 if (!bus->exit_on_disconnect) /* Shall we actually exit on disconnection? */
2614 bus->exited = true; /* never exit more than once */
2616 log_debug("Bus connection disconnected, exiting.");
2619 return sd_event_exit(bus->event, EXIT_FAILURE);
2623 assert_not_reached("exit() didn't exit?");
2626 static int process_closing_reply_callback(sd_bus *bus, struct reply_callback *c) {
2627 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2628 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2635 r = bus_message_new_synthetic_error(
2638 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2643 r = bus_seal_synthetic_message(bus, m);
2647 if (c->timeout_usec != 0) {
2648 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2649 c->timeout_usec = 0;
2652 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2655 slot = container_of(c, sd_bus_slot, reply_callback);
2657 bus->iteration_counter++;
2659 bus->current_message = m;
2660 bus->current_slot = sd_bus_slot_ref(slot);
2661 bus->current_handler = c->callback;
2662 bus->current_userdata = slot->userdata;
2663 r = c->callback(m, slot->userdata, &error_buffer);
2664 bus->current_userdata = NULL;
2665 bus->current_handler = NULL;
2666 bus->current_slot = NULL;
2667 bus->current_message = NULL;
2669 if (slot->floating) {
2670 bus_slot_disconnect(slot);
2671 sd_bus_slot_unref(slot);
2674 sd_bus_slot_unref(slot);
2676 return bus_maybe_reply_error(m, r, &error_buffer);
2679 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2680 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2681 struct reply_callback *c;
2685 assert(bus->state == BUS_CLOSING);
2687 /* First, fail all outstanding method calls */
2688 c = ordered_hashmap_first(bus->reply_callbacks);
2690 return process_closing_reply_callback(bus, c);
2692 /* Then, fake-drop all remaining bus tracking references */
2694 bus_track_close(bus->tracks);
2698 /* Then, synthesize a Disconnected message */
2699 r = sd_bus_message_new_signal(
2702 "/org/freedesktop/DBus/Local",
2703 "org.freedesktop.DBus.Local",
2708 bus_message_set_sender_local(bus, m);
2710 r = bus_seal_synthetic_message(bus, m);
2716 bus->current_message = m;
2717 bus->iteration_counter++;
2719 r = process_filter(bus, m);
2723 r = process_match(bus, m);
2727 /* Nothing else to do, exit now, if the condition holds */
2728 bus->exit_triggered = true;
2729 (void) bus_exit_now(bus);
2739 bus->current_message = NULL;
2744 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2745 BUS_DONT_DESTROY(bus);
2748 /* Returns 0 when we didn't do anything. This should cause the
2749 * caller to invoke sd_bus_wait() before returning the next
2750 * time. Returns > 0 when we did something, which possibly
2751 * means *ret is filled in with an unprocessed message. */
2753 assert_return(bus, -EINVAL);
2754 assert_return(!bus_pid_changed(bus), -ECHILD);
2756 /* We don't allow recursively invoking sd_bus_process(). */
2757 assert_return(!bus->current_message, -EBUSY);
2758 assert(!bus->current_slot);
2760 switch (bus->state) {
2768 case BUS_WATCH_BIND:
2769 r = bus_socket_process_watch_bind(bus);
2773 r = bus_socket_process_opening(bus);
2776 case BUS_AUTHENTICATING:
2777 r = bus_socket_process_authenticating(bus);
2782 r = process_running(bus, hint_priority, priority, ret);
2786 /* This branch initializes *ret, hence we don't use the generic error checking below */
2790 return process_closing(bus, ret);
2793 assert_not_reached("Unknown state");
2796 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2797 bus_enter_closing(bus);
2808 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2809 return bus_process_internal(bus, false, 0, ret);
2812 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2813 return bus_process_internal(bus, true, priority, ret);
2816 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2817 struct pollfd p[2] = {};
2820 usec_t m = USEC_INFINITY;
2824 if (bus->state == BUS_CLOSING)
2827 if (!BUS_IS_OPEN(bus->state))
2830 if (bus->state == BUS_WATCH_BIND) {
2831 assert(bus->inotify_fd >= 0);
2833 p[0].events = POLLIN;
2834 p[0].fd = bus->inotify_fd;
2839 e = sd_bus_get_events(bus);
2844 /* The caller really needs some more data, he doesn't
2845 * care about what's already read, or any timeouts
2846 * except its own. */
2850 /* The caller wants to process if there's something to
2851 * process, but doesn't care otherwise */
2853 r = sd_bus_get_timeout(bus, &until);
2857 m = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
2860 p[0].fd = bus->input_fd;
2861 if (bus->output_fd == bus->input_fd) {
2865 p[0].events = e & POLLIN;
2866 p[1].fd = bus->output_fd;
2867 p[1].events = e & POLLOUT;
2872 if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
2875 r = ppoll(p, n, m == USEC_INFINITY ? NULL : timespec_store(&ts, m), NULL);
2879 return r > 0 ? 1 : 0;
2882 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2884 assert_return(bus, -EINVAL);
2885 assert_return(!bus_pid_changed(bus), -ECHILD);
2887 if (bus->state == BUS_CLOSING)
2890 if (!BUS_IS_OPEN(bus->state))
2893 if (bus->rqueue_size > 0)
2896 return bus_poll(bus, false, timeout_usec);
2899 _public_ int sd_bus_flush(sd_bus *bus) {
2902 assert_return(bus, -EINVAL);
2903 assert_return(!bus_pid_changed(bus), -ECHILD);
2905 if (bus->state == BUS_CLOSING)
2908 if (!BUS_IS_OPEN(bus->state))
2911 /* We never were connected? Don't hang in inotify for good, as there's no timeout set for it */
2912 if (bus->state == BUS_WATCH_BIND)
2915 r = bus_ensure_running(bus);
2919 if (bus->wqueue_size <= 0)
2923 r = dispatch_wqueue(bus);
2925 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2926 bus_enter_closing(bus);
2933 if (bus->wqueue_size <= 0)
2936 r = bus_poll(bus, false, (uint64_t) -1);
2942 _public_ int sd_bus_add_filter(
2945 sd_bus_message_handler_t callback,
2950 assert_return(bus, -EINVAL);
2951 assert_return(callback, -EINVAL);
2952 assert_return(!bus_pid_changed(bus), -ECHILD);
2954 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
2958 s->filter_callback.callback = callback;
2960 bus->filter_callbacks_modified = true;
2961 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
2969 _public_ int sd_bus_add_match(
2973 sd_bus_message_handler_t callback,
2976 struct bus_match_component *components = NULL;
2977 unsigned n_components = 0;
2978 sd_bus_slot *s = NULL;
2981 assert_return(bus, -EINVAL);
2982 assert_return(match, -EINVAL);
2983 assert_return(!bus_pid_changed(bus), -ECHILD);
2985 r = bus_match_parse(match, &components, &n_components);
2989 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
2995 s->match_callback.callback = callback;
2997 if (bus->bus_client) {
2998 enum bus_match_scope scope;
3000 scope = bus_match_get_scope(components, n_components);
3002 /* Do not install server-side matches for matches
3003 * against the local service, interface or bus path. */
3004 if (scope != BUS_MATCH_LOCAL) {
3006 /* We store the original match string, so that
3007 * we can use it to remove the match again. */
3009 s->match_callback.match_string = strdup(match);
3010 if (!s->match_callback.match_string) {
3015 r = bus_add_match_internal(bus, s->match_callback.match_string, components, n_components);
3019 s->match_added = true;
3023 bus->match_callbacks_modified = true;
3024 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3033 bus_match_parse_free(components, n_components);
3034 sd_bus_slot_unref(s);
3039 #if 0 /// UNNEEDED by elogind
3040 int bus_remove_match_by_string(
3043 sd_bus_message_handler_t callback,
3046 struct bus_match_component *components = NULL;
3047 unsigned n_components = 0;
3048 struct match_callback *c;
3051 assert_return(bus, -EINVAL);
3052 assert_return(match, -EINVAL);
3053 assert_return(!bus_pid_changed(bus), -ECHILD);
3055 r = bus_match_parse(match, &components, &n_components);
3059 r = bus_match_find(&bus->match_callbacks, components, n_components, NULL, NULL, &c);
3063 sd_bus_slot_unref(container_of(c, sd_bus_slot, match_callback));
3066 bus_match_parse_free(components, n_components);
3072 bool bus_pid_changed(sd_bus *bus) {
3075 /* We don't support people creating a bus connection and
3076 * keeping it around over a fork(). Let's complain. */
3078 return bus->original_pid != getpid_cached();
3081 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3082 sd_bus *bus = userdata;
3087 /* Note that this is called both on input_fd, output_fd as well as inotify_fd events */
3089 r = sd_bus_process(bus, NULL);
3091 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3092 bus_enter_closing(bus);
3098 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3099 sd_bus *bus = userdata;
3104 r = sd_bus_process(bus, NULL);
3106 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3107 bus_enter_closing(bus);
3113 static int prepare_callback(sd_event_source *s, void *userdata) {
3114 sd_bus *bus = userdata;
3121 e = sd_bus_get_events(bus);
3127 if (bus->output_fd != bus->input_fd) {
3129 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3133 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3135 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3139 r = sd_bus_get_timeout(bus, &until);
3145 j = sd_event_source_set_time(bus->time_event_source, until);
3152 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3159 log_debug_errno(r, "Preparing of bus events failed, closing down: %m");
3160 bus_enter_closing(bus);
3165 static int quit_callback(sd_event_source *event, void *userdata) {
3166 sd_bus *bus = userdata;
3176 int bus_attach_io_events(sd_bus *bus) {
3181 if (bus->input_fd < 0)
3187 if (!bus->input_io_event_source) {
3188 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3192 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3196 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3200 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3202 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3207 if (bus->output_fd != bus->input_fd) {
3208 assert(bus->output_fd >= 0);
3210 if (!bus->output_io_event_source) {
3211 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3215 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3219 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3221 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3230 static void bus_detach_io_events(sd_bus *bus) {
3233 if (bus->input_io_event_source) {
3234 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3235 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3238 if (bus->output_io_event_source) {
3239 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3240 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3244 int bus_attach_inotify_event(sd_bus *bus) {
3249 if (bus->inotify_fd < 0)
3255 if (!bus->inotify_event_source) {
3256 r = sd_event_add_io(bus->event, &bus->inotify_event_source, bus->inotify_fd, EPOLLIN, io_callback, bus);
3260 r = sd_event_source_set_priority(bus->inotify_event_source, bus->event_priority);
3264 r = sd_event_source_set_description(bus->inotify_event_source, "bus-inotify");
3266 r = sd_event_source_set_io_fd(bus->inotify_event_source, bus->inotify_fd);
3273 static void bus_detach_inotify_event(sd_bus *bus) {
3276 if (bus->inotify_event_source) {
3277 sd_event_source_set_enabled(bus->inotify_event_source, SD_EVENT_OFF);
3278 bus->inotify_event_source = sd_event_source_unref(bus->inotify_event_source);
3282 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3285 assert_return(bus, -EINVAL);
3286 assert_return(!bus->event, -EBUSY);
3288 assert(!bus->input_io_event_source);
3289 assert(!bus->output_io_event_source);
3290 assert(!bus->time_event_source);
3293 bus->event = sd_event_ref(event);
3295 r = sd_event_default(&bus->event);
3300 bus->event_priority = priority;
3302 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3306 r = sd_event_source_set_priority(bus->time_event_source, priority);
3310 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3314 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3318 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3322 r = bus_attach_io_events(bus);
3326 r = bus_attach_inotify_event(bus);
3333 sd_bus_detach_event(bus);
3337 _public_ int sd_bus_detach_event(sd_bus *bus) {
3338 assert_return(bus, -EINVAL);
3343 bus_detach_io_events(bus);
3344 bus_detach_inotify_event(bus);
3346 if (bus->time_event_source) {
3347 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3348 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3351 if (bus->quit_event_source) {
3352 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3353 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3356 bus->event = sd_event_unref(bus->event);
3360 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3361 assert_return(bus, NULL);
3366 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3367 assert_return(bus, NULL);
3369 return bus->current_message;
3372 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3373 assert_return(bus, NULL);
3375 return bus->current_slot;
3378 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3379 assert_return(bus, NULL);
3381 return bus->current_handler;
3384 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3385 assert_return(bus, NULL);
3387 return bus->current_userdata;
3390 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3395 assert(default_bus);
3398 return !!*default_bus;
3401 *ret = sd_bus_ref(*default_bus);
3409 b->default_bus_ptr = default_bus;
3417 _public_ int sd_bus_default_system(sd_bus **ret) {
3418 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3422 _public_ int sd_bus_default_user(sd_bus **ret) {
3423 #if 0 /// elogind does not support user buses
3424 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3426 return sd_bus_default_system(ret);
3430 _public_ int sd_bus_default(sd_bus **ret) {
3434 /* Let's try our best to reuse another cached connection. If
3435 * the starter bus type is set, connect via our normal
3436 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3437 * we can share the connection with the user/system default
3440 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3442 if (streq(e, "system"))
3443 return sd_bus_default_system(ret);
3444 #if 0 /// elogind does not support systemd units
3445 else if (STR_IN_SET(e, "user", "session"))
3446 return sd_bus_default_user(ret);
3450 /* No type is specified, so we have not other option than to
3451 * use the starter address if it is set. */
3452 e = secure_getenv("DBUS_STARTER_ADDRESS");
3454 return bus_default(sd_bus_open, &default_starter_bus, ret);
3456 /* Finally, if nothing is set use the cached connection for
3457 * the right scope */
3459 #if 0 /// elogind does not support systemd user instances
3460 if (cg_pid_get_owner_uid(0, NULL) >= 0)
3461 return sd_bus_default_user(ret);
3464 return sd_bus_default_system(ret);
3467 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3468 assert_return(b, -EINVAL);
3469 assert_return(tid, -EINVAL);
3470 assert_return(!bus_pid_changed(b), -ECHILD);
3478 return sd_event_get_tid(b->event, tid);
3483 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3484 _cleanup_free_ char *e = NULL;
3487 assert_return(object_path_is_valid(prefix), -EINVAL);
3488 assert_return(external_id, -EINVAL);
3489 assert_return(ret_path, -EINVAL);
3491 e = bus_label_escape(external_id);
3495 ret = strjoin(prefix, "/", e);
3503 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3507 assert_return(object_path_is_valid(path), -EINVAL);
3508 assert_return(object_path_is_valid(prefix), -EINVAL);
3509 assert_return(external_id, -EINVAL);
3511 e = object_path_startswith(path, prefix);
3513 *external_id = NULL;
3517 ret = bus_label_unescape(e);
3525 _public_ int sd_bus_path_encode_many(char **out, const char *path_template, ...) {
3526 _cleanup_strv_free_ char **labels = NULL;
3527 char *path, *path_pos, **label_pos;
3528 const char *sep, *template_pos;
3533 assert_return(out, -EINVAL);
3534 assert_return(path_template, -EINVAL);
3536 path_length = strlen(path_template);
3538 va_start(list, path_template);
3539 for (sep = strchr(path_template, '%'); sep; sep = strchr(sep + 1, '%')) {
3543 arg = va_arg(list, const char *);
3549 label = bus_label_escape(arg);
3555 r = strv_consume(&labels, label);
3561 /* add label length, but account for the format character */
3562 path_length += strlen(label) - 1;
3566 path = malloc(path_length + 1);
3573 for (template_pos = path_template; *template_pos; ) {
3574 sep = strchrnul(template_pos, '%');
3575 path_pos = mempcpy(path_pos, template_pos, sep - template_pos);
3579 path_pos = stpcpy(path_pos, *label_pos++);
3580 template_pos = sep + 1;
3588 _public_ int sd_bus_path_decode_many(const char *path, const char *path_template, ...) {
3589 _cleanup_strv_free_ char **labels = NULL;
3590 const char *template_pos, *path_pos;
3596 * This decodes an object-path based on a template argument. The
3597 * template consists of a verbatim path, optionally including special
3600 * - Each occurrence of '%' in the template matches an arbitrary
3601 * substring of a label in the given path. At most one such
3602 * directive is allowed per label. For each such directive, the
3603 * caller must provide an output parameter (char **) via va_arg. If
3604 * NULL is passed, the given label is verified, but not returned.
3605 * For each matched label, the *decoded* label is stored in the
3606 * passed output argument, and the caller is responsible to free
3607 * it. Note that the output arguments are only modified if the
3608 * actualy path matched the template. Otherwise, they're left
3611 * This function returns <0 on error, 0 if the path does not match the
3612 * template, 1 if it matched.
3615 assert_return(path, -EINVAL);
3616 assert_return(path_template, -EINVAL);
3620 for (template_pos = path_template; *template_pos; ) {
3625 /* verify everything until the next '%' matches verbatim */
3626 sep = strchrnul(template_pos, '%');
3627 length = sep - template_pos;
3628 if (strncmp(path_pos, template_pos, length))
3632 template_pos += length;
3637 /* We found the next '%' character. Everything up until here
3638 * matched. We now skip ahead to the end of this label and make
3639 * sure it matches the tail of the label in the path. Then we
3640 * decode the string in-between and save it for later use. */
3642 ++template_pos; /* skip over '%' */
3644 sep = strchrnul(template_pos, '/');
3645 length = sep - template_pos; /* length of suffix to match verbatim */
3647 /* verify the suffixes match */
3648 sep = strchrnul(path_pos, '/');
3649 if (sep - path_pos < (ssize_t)length ||
3650 strncmp(sep - length, template_pos, length))
3653 template_pos += length; /* skip over matched label */
3654 length = sep - path_pos - length; /* length of sub-label to decode */
3656 /* store unescaped label for later use */
3657 label = bus_label_unescape_n(path_pos, length);
3661 r = strv_consume(&labels, label);
3665 path_pos = sep; /* skip decoded label and suffix */
3668 /* end of template must match end of path */
3672 /* copy the labels over to the caller */
3673 va_start(list, path_template);
3674 for (label_pos = labels; label_pos && *label_pos; ++label_pos) {
3677 arg = va_arg(list, char **);
3685 labels = mfree(labels);
3689 _public_ int sd_bus_try_close(sd_bus *bus) {
3690 assert_return(bus, -EINVAL);
3691 assert_return(!bus_pid_changed(bus), -ECHILD);
3696 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3697 assert_return(bus, -EINVAL);
3698 assert_return(description, -EINVAL);
3699 assert_return(bus->description, -ENXIO);
3700 assert_return(!bus_pid_changed(bus), -ECHILD);
3702 *description = bus->description;
3706 int bus_get_root_path(sd_bus *bus) {
3709 if (bus->cgroup_root)
3712 r = cg_get_root_path(&bus->cgroup_root);
3714 bus->cgroup_root = strdup("/");
3715 if (!bus->cgroup_root)
3724 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3725 assert_return(bus, -EINVAL);
3726 assert_return(scope, -EINVAL);
3727 assert_return(!bus_pid_changed(bus), -ECHILD);
3734 if (bus->is_system) {
3742 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3744 assert_return(bus, -EINVAL);
3745 assert_return(address, -EINVAL);
3746 assert_return(!bus_pid_changed(bus), -ECHILD);
3749 *address = bus->address;
3756 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
3757 assert_return(bus, -EINVAL);
3758 assert_return(mask, -EINVAL);
3759 assert_return(!bus_pid_changed(bus), -ECHILD);
3761 *mask = bus->creds_mask;
3765 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
3766 assert_return(bus, -EINVAL);
3767 assert_return(!bus_pid_changed(bus), -ECHILD);
3769 return bus->bus_client;
3772 _public_ int sd_bus_is_server(sd_bus *bus) {
3773 assert_return(bus, -EINVAL);
3774 assert_return(!bus_pid_changed(bus), -ECHILD);
3776 return bus->is_server;
3779 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
3780 assert_return(bus, -EINVAL);
3781 assert_return(!bus_pid_changed(bus), -ECHILD);
3783 return bus->anonymous_auth;
3786 _public_ int sd_bus_is_trusted(sd_bus *bus) {
3787 assert_return(bus, -EINVAL);
3788 assert_return(!bus_pid_changed(bus), -ECHILD);
3790 return bus->trusted;
3793 _public_ int sd_bus_is_monitor(sd_bus *bus) {
3794 assert_return(bus, -EINVAL);
3795 assert_return(!bus_pid_changed(bus), -ECHILD);
3797 return !!(bus->hello_flags & KDBUS_HELLO_MONITOR);
3800 static void flush_close(sd_bus *bus) {
3804 /* Flushes and closes the specified bus. We take a ref before,
3805 * to ensure the flushing does not cause the bus to be
3808 sd_bus_flush_close_unref(sd_bus_ref(bus));
3811 _public_ void sd_bus_default_flush_close(void) {
3812 flush_close(default_starter_bus);
3813 #if 0 /// elogind does not support user buses
3814 flush_close(default_user_bus);
3816 flush_close(default_system_bus);
3819 _public_ int sd_bus_set_exit_on_disconnect(sd_bus *bus, int b) {
3820 assert_return(bus, -EINVAL);
3822 /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
3823 * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
3824 * from the client side. */
3825 bus->exit_on_disconnect = b;
3827 /* If the exit condition was triggered already, exit immediately. */
3828 return bus_exit_now(bus);
3831 _public_ int sd_bus_get_exit_on_disconnect(sd_bus *bus) {
3832 assert_return(bus, -EINVAL);
3834 return bus->exit_on_disconnect;