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 "process-util.h"
54 #include "string-util.h"
58 /// Additional includes needed by elogind
59 #include "process-util.h"
61 #define log_debug_bus_message(m) \
63 sd_bus_message *_mm = (m); \
64 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", \
65 bus_message_type_to_string(_mm->header->type), \
66 strna(sd_bus_message_get_sender(_mm)), \
67 strna(sd_bus_message_get_destination(_mm)), \
68 strna(sd_bus_message_get_path(_mm)), \
69 strna(sd_bus_message_get_interface(_mm)), \
70 strna(sd_bus_message_get_member(_mm)), \
71 BUS_MESSAGE_COOKIE(_mm), \
73 strna(_mm->root_container.signature), \
74 strna(_mm->error.name), \
75 strna(_mm->error.message)); \
78 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
79 static void bus_detach_io_events(sd_bus *b);
80 static void bus_detach_inotify_event(sd_bus *b);
82 static thread_local sd_bus *default_system_bus = NULL;
83 #if 0 /// UNNEEDED by elogind
84 static thread_local sd_bus *default_user_bus = NULL;
86 static thread_local sd_bus *default_starter_bus = NULL;
88 void bus_close_io_fds(sd_bus *b) {
91 bus_detach_io_events(b);
93 if (b->input_fd != b->output_fd)
94 safe_close(b->output_fd);
95 b->output_fd = b->input_fd = safe_close(b->input_fd);
98 void bus_close_inotify_fd(sd_bus *b) {
101 bus_detach_inotify_event(b);
103 b->inotify_fd = safe_close(b->inotify_fd);
104 b->inotify_watches = mfree(b->inotify_watches);
105 b->n_inotify_watches = 0;
108 static void bus_reset_queues(sd_bus *b) {
111 while (b->rqueue_size > 0)
112 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
114 b->rqueue = mfree(b->rqueue);
115 b->rqueue_allocated = 0;
117 while (b->wqueue_size > 0)
118 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
120 b->wqueue = mfree(b->wqueue);
121 b->wqueue_allocated = 0;
124 static void bus_free(sd_bus *b) {
128 assert(!b->track_queue);
131 b->state = BUS_CLOSED;
133 sd_bus_detach_event(b);
135 while ((s = b->slots)) {
136 /* At this point only floating slots can still be
137 * around, because the non-floating ones keep a
138 * reference to the bus, and we thus couldn't be
139 * destructing right now... We forcibly disconnect the
140 * slots here, so that they still can be referenced by
141 * apps, but are dead. */
144 bus_slot_disconnect(s);
145 sd_bus_slot_unref(s);
148 if (b->default_bus_ptr)
149 *b->default_bus_ptr = NULL;
152 bus_close_inotify_fd(b);
157 free(b->unique_name);
158 free(b->auth_buffer);
161 free(b->cgroup_root);
162 free(b->description);
163 free(b->patch_sender);
166 strv_free(b->exec_argv);
168 close_many(b->fds, b->n_fds);
173 ordered_hashmap_free_free(b->reply_callbacks);
174 prioq_free(b->reply_callbacks_prioq);
176 assert(b->match_callbacks.type == BUS_MATCH_ROOT);
177 bus_match_free(&b->match_callbacks);
179 hashmap_free_free(b->vtable_methods);
180 hashmap_free_free(b->vtable_properties);
182 assert(hashmap_isempty(b->nodes));
183 hashmap_free(b->nodes);
187 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
192 _public_ int sd_bus_new(sd_bus **ret) {
195 assert_return(ret, -EINVAL);
201 r->n_ref = REFCNT_INIT;
202 r->input_fd = r->output_fd = -1;
204 r->message_version = 1;
205 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
207 r->original_pid = getpid_cached();
208 r->n_groups = (size_t) -1;
210 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
212 /* We guarantee that wqueue always has space for at least one
214 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
223 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
226 assert_return(bus, -EINVAL);
227 assert_return(bus->state == BUS_UNSET, -EPERM);
228 assert_return(address, -EINVAL);
229 assert_return(!bus_pid_changed(bus), -ECHILD);
241 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
242 assert_return(bus, -EINVAL);
243 assert_return(bus->state == BUS_UNSET, -EPERM);
244 assert_return(input_fd >= 0, -EBADF);
245 assert_return(output_fd >= 0, -EBADF);
246 assert_return(!bus_pid_changed(bus), -ECHILD);
248 bus->input_fd = input_fd;
249 bus->output_fd = output_fd;
253 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
256 assert_return(bus, -EINVAL);
257 assert_return(bus->state == BUS_UNSET, -EPERM);
258 assert_return(path, -EINVAL);
259 assert_return(!strv_isempty(argv), -EINVAL);
260 assert_return(!bus_pid_changed(bus), -ECHILD);
272 free(bus->exec_path);
273 strv_free(bus->exec_argv);
281 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
282 assert_return(bus, -EINVAL);
283 assert_return(bus->state == BUS_UNSET, -EPERM);
284 assert_return(!bus->patch_sender, -EPERM);
285 assert_return(!bus_pid_changed(bus), -ECHILD);
287 bus->bus_client = !!b;
291 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
292 assert_return(bus, -EINVAL);
293 assert_return(bus->state == BUS_UNSET, -EPERM);
294 assert_return(!bus_pid_changed(bus), -ECHILD);
300 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
301 assert_return(bus, -EINVAL);
302 assert_return(bus->state == BUS_UNSET, -EPERM);
303 assert_return(!bus_pid_changed(bus), -ECHILD);
309 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
310 assert_return(bus, -EINVAL);
311 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
312 assert_return(!bus_pid_changed(bus), -ECHILD);
314 /* This is not actually supported by any of our transports these days, but we do honour it for synthetic
315 * replies, and maybe one day classic D-Bus learns this too */
316 bus->attach_timestamp = b;
321 _public_ int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t mask) {
322 assert_return(bus, -EINVAL);
323 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
324 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
325 assert_return(!bus_pid_changed(bus), -ECHILD);
327 SET_FLAG(bus->creds_mask, mask, b);
329 /* The well knowns we need unconditionally, so that matches can work */
330 bus->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
335 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
336 assert_return(bus, -EINVAL);
337 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
338 assert_return(bus->state == BUS_UNSET, -EPERM);
339 assert_return(!bus_pid_changed(bus), -ECHILD);
341 bus->is_server = !!b;
342 bus->server_id = server_id;
346 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
347 assert_return(bus, -EINVAL);
348 assert_return(bus->state == BUS_UNSET, -EPERM);
349 assert_return(!bus_pid_changed(bus), -ECHILD);
351 bus->anonymous_auth = !!b;
355 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
356 assert_return(bus, -EINVAL);
357 assert_return(bus->state == BUS_UNSET, -EPERM);
358 assert_return(!bus_pid_changed(bus), -ECHILD);
364 _public_ int sd_bus_set_description(sd_bus *bus, const char *description) {
365 assert_return(bus, -EINVAL);
366 assert_return(bus->state == BUS_UNSET, -EPERM);
367 assert_return(!bus_pid_changed(bus), -ECHILD);
369 return free_and_strdup(&bus->description, description);
372 _public_ int sd_bus_set_allow_interactive_authorization(sd_bus *bus, int b) {
373 assert_return(bus, -EINVAL);
374 assert_return(!bus_pid_changed(bus), -ECHILD);
376 bus->allow_interactive_authorization = !!b;
380 _public_ int sd_bus_get_allow_interactive_authorization(sd_bus *bus) {
381 assert_return(bus, -EINVAL);
382 assert_return(!bus_pid_changed(bus), -ECHILD);
384 return bus->allow_interactive_authorization;
387 _public_ int sd_bus_set_watch_bind(sd_bus *bus, int b) {
388 assert_return(bus, -EINVAL);
389 assert_return(bus->state == BUS_UNSET, -EPERM);
390 assert_return(!bus_pid_changed(bus), -ECHILD);
396 _public_ int sd_bus_get_watch_bind(sd_bus *bus) {
397 assert_return(bus, -EINVAL);
398 assert_return(!bus_pid_changed(bus), -ECHILD);
400 return bus->watch_bind;
403 _public_ int sd_bus_set_connected_signal(sd_bus *bus, int b) {
404 assert_return(bus, -EINVAL);
405 assert_return(bus->state == BUS_UNSET, -EPERM);
406 assert_return(!bus_pid_changed(bus), -ECHILD);
408 bus->connected_signal = b;
412 _public_ int sd_bus_get_connected_signal(sd_bus *bus) {
413 assert_return(bus, -EINVAL);
414 assert_return(!bus_pid_changed(bus), -ECHILD);
416 return bus->connected_signal;
419 static int synthesize_connected_signal(sd_bus *bus) {
420 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
425 /* If enabled, synthesizes a local "Connected" signal mirroring the local "Disconnected" signal. This is called
426 * whenever we fully established a connection, i.e. after the authorization phase, and after receiving the
427 * Hello() reply. Or in other words, whenver we enter BUS_RUNNING state.
429 * This is useful so that clients can start doing stuff whenver the connection is fully established in a way
430 * that works independently from whether we connected to a full bus or just a direct connection. */
432 if (!bus->connected_signal)
435 r = sd_bus_message_new_signal(
438 "/org/freedesktop/DBus/Local",
439 "org.freedesktop.DBus.Local",
444 bus_message_set_sender_local(bus, m);
446 r = bus_seal_synthetic_message(bus, m);
450 r = bus_rqueue_make_room(bus);
454 /* Insert at the very front */
455 memmove(bus->rqueue + 1, bus->rqueue, sizeof(sd_bus_message*) * bus->rqueue_size);
463 void bus_set_state(sd_bus *bus, enum bus_state state) {
465 static const char * const table[_BUS_STATE_MAX] = {
466 [BUS_UNSET] = "UNSET",
467 [BUS_WATCH_BIND] = "WATCH_BIND",
468 [BUS_OPENING] = "OPENING",
469 [BUS_AUTHENTICATING] = "AUTHENTICATING",
470 [BUS_HELLO] = "HELLO",
471 [BUS_RUNNING] = "RUNNING",
472 [BUS_CLOSING] = "CLOSING",
473 [BUS_CLOSED] = "CLOSED",
477 assert(state < _BUS_STATE_MAX);
479 if (state == bus->state)
482 log_debug("Bus %s: changing state %s → %s", strna(bus->description), table[bus->state], table[state]);
486 static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) {
494 assert(IN_SET(bus->state, BUS_HELLO, BUS_CLOSING));
496 r = sd_bus_message_get_errno(reply);
500 r = sd_bus_message_read(reply, "s", &s);
504 if (!service_name_is_valid(s) || s[0] != ':')
507 bus->unique_name = strdup(s);
508 if (!bus->unique_name)
511 if (bus->state == BUS_HELLO) {
512 bus_set_state(bus, BUS_RUNNING);
514 r = synthesize_connected_signal(bus);
522 static int bus_send_hello(sd_bus *bus) {
523 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
528 if (!bus->bus_client)
531 r = sd_bus_message_new_method_call(
534 "org.freedesktop.DBus",
535 "/org/freedesktop/DBus",
536 "org.freedesktop.DBus",
541 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
544 int bus_start_running(sd_bus *bus) {
545 struct reply_callback *c;
551 assert(bus->state < BUS_HELLO);
553 /* We start all method call timeouts when we enter BUS_HELLO or BUS_RUNNING mode. At this point let's convert
554 * all relative to absolute timestamps. Note that we do not reshuffle the reply callback priority queue since
555 * adding a fixed value to all entries should not alter the internal order. */
557 n = now(CLOCK_MONOTONIC);
558 ORDERED_HASHMAP_FOREACH(c, bus->reply_callbacks, i) {
559 if (c->timeout_usec == 0)
562 c->timeout_usec = usec_add(n, c->timeout_usec);
565 if (bus->bus_client) {
566 bus_set_state(bus, BUS_HELLO);
570 bus_set_state(bus, BUS_RUNNING);
572 r = synthesize_connected_signal(bus);
579 static int parse_address_key(const char **p, const char *key, char **value) {
580 size_t l, n = 0, allocated = 0;
590 if (strncmp(*p, key, l) != 0)
603 while (!IN_SET(*a, ';', ',', 0)) {
621 c = (char) ((x << 4) | y);
628 if (!GREEDY_REALLOC(r, allocated, n + 2))
652 static void skip_address_key(const char **p) {
656 *p += strcspn(*p, ",");
662 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
663 _cleanup_free_ char *path = NULL, *abstract = NULL;
672 while (!IN_SET(**p, 0, ';')) {
673 r = parse_address_key(p, "guid", guid);
679 r = parse_address_key(p, "path", &path);
685 r = parse_address_key(p, "abstract", &abstract);
694 if (!path && !abstract)
697 if (path && abstract)
702 if (l > sizeof(b->sockaddr.un.sun_path))
705 b->sockaddr.un.sun_family = AF_UNIX;
706 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
707 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
708 } else if (abstract) {
709 l = strlen(abstract);
710 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
713 b->sockaddr.un.sun_family = AF_UNIX;
714 b->sockaddr.un.sun_path[0] = 0;
715 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
716 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
724 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
725 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
727 struct addrinfo *result, hints = {
728 .ai_socktype = SOCK_STREAM,
729 .ai_flags = AI_ADDRCONFIG,
737 while (!IN_SET(**p, 0, ';')) {
738 r = parse_address_key(p, "guid", guid);
744 r = parse_address_key(p, "host", &host);
750 r = parse_address_key(p, "port", &port);
756 r = parse_address_key(p, "family", &family);
769 if (streq(family, "ipv4"))
770 hints.ai_family = AF_INET;
771 else if (streq(family, "ipv6"))
772 hints.ai_family = AF_INET6;
777 r = getaddrinfo(host, port, &hints, &result);
781 return -EADDRNOTAVAIL;
783 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
784 b->sockaddr_size = result->ai_addrlen;
786 freeaddrinfo(result);
793 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
795 unsigned n_argv = 0, j;
797 size_t allocated = 0;
805 while (!IN_SET(**p, 0, ';')) {
806 r = parse_address_key(p, "guid", guid);
812 r = parse_address_key(p, "path", &path);
818 if (startswith(*p, "argv")) {
822 ul = strtoul(*p + 4, (char**) p, 10);
823 if (errno > 0 || **p != '=' || ul > 256) {
831 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
839 r = parse_address_key(p, NULL, argv + ul);
854 /* Make sure there are no holes in the array, with the
855 * exception of argv[0] */
856 for (j = 1; j < n_argv; j++)
862 if (argv && argv[0] == NULL) {
863 argv[0] = strdup(path);
878 for (j = 0; j < n_argv; j++)
886 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
887 _cleanup_free_ char *machine = NULL, *pid = NULL;
895 while (!IN_SET(**p, 0, ';')) {
896 r = parse_address_key(p, "guid", guid);
902 r = parse_address_key(p, "machine", &machine);
908 r = parse_address_key(p, "pid", &pid);
917 if (!machine == !pid)
921 if (!machine_name_is_valid(machine))
924 free_and_replace(b->machine, machine);
926 b->machine = mfree(b->machine);
930 r = parse_pid(pid, &b->nspid);
936 b->sockaddr.un.sun_family = AF_UNIX;
937 /* Note that we use the old /var/run prefix here, to increase compatibility with really old containers */
938 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
939 b->sockaddr_size = SOCKADDR_UN_LEN(b->sockaddr.un);
945 static void bus_reset_parsed_address(sd_bus *b) {
949 b->sockaddr_size = 0;
950 b->exec_argv = strv_free(b->exec_argv);
951 b->exec_path = mfree(b->exec_path);
952 b->server_id = SD_ID128_NULL;
953 b->machine = mfree(b->machine);
957 static int bus_parse_next_address(sd_bus *b) {
958 _cleanup_free_ char *guid = NULL;
966 if (b->address[b->address_index] == 0)
969 bus_reset_parsed_address(b);
971 a = b->address + b->address_index;
980 if (startswith(a, "unix:")) {
983 r = parse_unix_address(b, &a, &guid);
988 } else if (startswith(a, "tcp:")) {
991 r = parse_tcp_address(b, &a, &guid);
997 } else if (startswith(a, "unixexec:")) {
1000 r = parse_exec_address(b, &a, &guid);
1006 } else if (startswith(a, "x-machine-unix:")) {
1009 r = parse_container_unix_address(b, &a, &guid);
1022 r = sd_id128_from_string(guid, &b->server_id);
1027 b->address_index = a - b->address;
1031 static int bus_start_address(sd_bus *b) {
1037 bus_close_io_fds(b);
1038 bus_close_inotify_fd(b);
1040 /* If you provide multiple different bus-addresses, we
1041 * try all of them in order and use the first one that
1045 r = bus_socket_exec(b);
1046 else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC)
1047 r = bus_container_connect_socket(b);
1048 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
1049 r = bus_socket_connect(b);
1056 q = bus_attach_io_events(b);
1060 q = bus_attach_inotify_event(b);
1067 b->last_connect_error = -r;
1070 r = bus_parse_next_address(b);
1074 return b->last_connect_error > 0 ? -b->last_connect_error : -ECONNREFUSED;
1078 int bus_next_address(sd_bus *b) {
1081 bus_reset_parsed_address(b);
1082 return bus_start_address(b);
1085 static int bus_start_fd(sd_bus *b) {
1090 assert(b->input_fd >= 0);
1091 assert(b->output_fd >= 0);
1093 r = fd_nonblock(b->input_fd, true);
1097 r = fd_cloexec(b->input_fd, true);
1101 if (b->input_fd != b->output_fd) {
1102 r = fd_nonblock(b->output_fd, true);
1106 r = fd_cloexec(b->output_fd, true);
1111 if (fstat(b->input_fd, &st) < 0)
1114 return bus_socket_take_fd(b);
1117 _public_ int sd_bus_start(sd_bus *bus) {
1120 assert_return(bus, -EINVAL);
1121 assert_return(bus->state == BUS_UNSET, -EPERM);
1122 assert_return(!bus_pid_changed(bus), -ECHILD);
1124 bus_set_state(bus, BUS_OPENING);
1126 if (bus->is_server && bus->bus_client)
1129 if (bus->input_fd >= 0)
1130 r = bus_start_fd(bus);
1131 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->machine)
1132 r = bus_start_address(bus);
1141 return bus_send_hello(bus);
1144 _public_ int sd_bus_open(sd_bus **ret) {
1149 assert_return(ret, -EINVAL);
1151 /* Let's connect to the starter bus if it is set, and
1152 * otherwise to the bus that is appropropriate for the scope
1153 * we are running in */
1155 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1157 if (streq(e, "system"))
1158 return sd_bus_open_system(ret);
1159 #if 0 /// elogind does not support systemd user instances
1160 else if (STR_IN_SET(e, "session", "user"))
1161 return sd_bus_open_user(ret);
1165 e = secure_getenv("DBUS_STARTER_ADDRESS");
1167 #if 0 /// elogind does not support systemd user instances
1168 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1169 return sd_bus_open_user(ret);
1172 return sd_bus_open_system(ret);
1179 r = sd_bus_set_address(b, e);
1183 b->bus_client = true;
1185 /* We don't know whether the bus is trusted or not, so better
1186 * be safe, and authenticate everything */
1188 b->is_local = false;
1189 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1191 r = sd_bus_start(b);
1203 int bus_set_address_system(sd_bus *b) {
1207 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1209 return sd_bus_set_address(b, e);
1211 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1214 _public_ int sd_bus_open_system(sd_bus **ret) {
1218 assert_return(ret, -EINVAL);
1224 r = bus_set_address_system(b);
1228 b->bus_client = true;
1229 b->is_system = true;
1231 /* Let's do per-method access control on the system bus. We
1232 * need the caller's UID and capability set for that. */
1234 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1237 r = sd_bus_start(b);
1249 #if 0 /// elogind can not open/use a user bus
1250 int bus_set_address_user(sd_bus *b) {
1252 _cleanup_free_ char *ee = NULL, *s = NULL;
1256 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1258 return sd_bus_set_address(b, e);
1260 e = secure_getenv("XDG_RUNTIME_DIR");
1264 ee = bus_address_escape(e);
1268 if (asprintf(&s, DEFAULT_USER_BUS_ADDRESS_FMT, ee) < 0)
1278 _public_ int sd_bus_open_user(sd_bus **ret) {
1279 #if 0 /// elogind does not support user buses
1283 assert_return(ret, -EINVAL);
1289 r = bus_set_address_user(b);
1293 b->bus_client = true;
1296 /* We don't do any per-method access control on the user
1301 r = sd_bus_start(b);
1312 return sd_bus_open_system(ret);
1316 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1317 _cleanup_free_ char *e = NULL;
1318 char *m = NULL, *c = NULL;
1323 /* Let's see if we shall enter some container */
1324 m = strchr(host, ':');
1328 /* Let's make sure this is not a port of some kind,
1329 * and is a valid machine name. */
1330 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1333 /* Cut out the host part */
1334 t = strndupa(host, m - host - 1);
1335 e = bus_address_escape(t);
1339 c = strjoina(",argv5=--machine=", m);
1344 e = bus_address_escape(host);
1349 b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e, ",argv4=systemd-stdio-bridge", c);
1356 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1360 assert_return(host, -EINVAL);
1361 assert_return(ret, -EINVAL);
1363 r = sd_bus_new(&bus);
1367 r = bus_set_address_system_remote(bus, host);
1371 bus->bus_client = true;
1372 bus->trusted = false;
1373 bus->is_system = true;
1374 bus->is_local = false;
1376 r = sd_bus_start(bus);
1388 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1389 _cleanup_free_ char *e = NULL;
1394 e = bus_address_escape(machine);
1398 b->address = strjoin("x-machine-unix:machine=", e);
1405 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1409 assert_return(machine, -EINVAL);
1410 assert_return(ret, -EINVAL);
1411 assert_return(machine_name_is_valid(machine), -EINVAL);
1413 r = sd_bus_new(&bus);
1417 r = bus_set_address_system_machine(bus, machine);
1421 bus->bus_client = true;
1422 bus->trusted = false;
1423 bus->is_system = true;
1424 bus->is_local = false;
1426 r = sd_bus_start(bus);
1438 _public_ void sd_bus_close(sd_bus *bus) {
1442 if (bus->state == BUS_CLOSED)
1444 if (bus_pid_changed(bus))
1447 bus_set_state(bus, BUS_CLOSED);
1449 sd_bus_detach_event(bus);
1451 /* Drop all queued messages so that they drop references to
1452 * the bus object and the bus may be freed */
1453 bus_reset_queues(bus);
1455 bus_close_io_fds(bus);
1456 bus_close_inotify_fd(bus);
1459 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1467 return sd_bus_unref(bus);
1470 void bus_enter_closing(sd_bus *bus) {
1473 if (!IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING, BUS_HELLO, BUS_RUNNING))
1476 bus_set_state(bus, BUS_CLOSING);
1479 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1484 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1489 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1495 i = REFCNT_DEC(bus->n_ref);
1503 _public_ int sd_bus_is_open(sd_bus *bus) {
1505 assert_return(bus, -EINVAL);
1506 assert_return(!bus_pid_changed(bus), -ECHILD);
1508 return BUS_IS_OPEN(bus->state);
1511 _public_ int sd_bus_is_ready(sd_bus *bus) {
1512 assert_return(bus, -EINVAL);
1513 assert_return(!bus_pid_changed(bus), -ECHILD);
1515 return bus->state == BUS_RUNNING;
1518 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1521 assert_return(bus, -EINVAL);
1522 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1523 assert_return(!bus_pid_changed(bus), -ECHILD);
1525 if (bus->is_monitor)
1528 if (type == SD_BUS_TYPE_UNIX_FD) {
1529 if (!bus->accept_fd)
1532 r = bus_ensure_running(bus);
1536 return bus->can_fds;
1539 return bus_type_is_valid(type);
1542 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1545 assert_return(bus, -EINVAL);
1546 assert_return(id, -EINVAL);
1547 assert_return(!bus_pid_changed(bus), -ECHILD);
1549 r = bus_ensure_running(bus);
1553 *id = bus->server_id;
1557 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1564 /* If we copy the same message to multiple
1565 * destinations, avoid using the same cookie
1567 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1572 timeout = BUS_DEFAULT_TIMEOUT;
1574 if (!m->sender && b->patch_sender) {
1575 r = sd_bus_message_set_sender(m, b->patch_sender);
1580 return sd_bus_message_seal(m, ++b->cookie, timeout);
1583 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1584 bool remarshal = false;
1588 /* wrong packet version */
1589 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1592 /* wrong packet endianness */
1593 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1596 return remarshal ? bus_message_remarshal(b, m) : 0;
1599 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1603 /* Fake some timestamps, if they were requested, and not
1604 * already initialized */
1605 if (b->attach_timestamp) {
1606 if (m->realtime <= 0)
1607 m->realtime = now(CLOCK_REALTIME);
1609 if (m->monotonic <= 0)
1610 m->monotonic = now(CLOCK_MONOTONIC);
1613 /* The bus specification says the serial number cannot be 0,
1614 * hence let's fill something in for synthetic messages. Since
1615 * synthetic messages might have a fake sender and we don't
1616 * want to interfere with the real sender's serial numbers we
1617 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1618 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1619 * even though kdbus can do 64bit. */
1620 return sd_bus_message_seal(m, 0xFFFFFFFFULL, 0);
1623 static int bus_write_message(sd_bus *bus, sd_bus_message *m, size_t *idx) {
1629 r = bus_socket_write_message(bus, m, idx);
1633 if (*idx >= BUS_MESSAGE_SIZE(m))
1634 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",
1635 bus_message_type_to_string(m->header->type),
1636 strna(sd_bus_message_get_sender(m)),
1637 strna(sd_bus_message_get_destination(m)),
1638 strna(sd_bus_message_get_path(m)),
1639 strna(sd_bus_message_get_interface(m)),
1640 strna(sd_bus_message_get_member(m)),
1641 BUS_MESSAGE_COOKIE(m),
1643 strna(m->root_container.signature),
1644 strna(m->error.name),
1645 strna(m->error.message));
1650 static int dispatch_wqueue(sd_bus *bus) {
1654 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1656 while (bus->wqueue_size > 0) {
1658 r = bus_write_message(bus, bus->wqueue[0], &bus->windex);
1662 /* Didn't do anything this time */
1664 else if (bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1665 /* Fully written. Let's drop the entry from
1668 * This isn't particularly optimized, but
1669 * well, this is supposed to be our worst-case
1670 * buffer only, and the socket buffer is
1671 * supposed to be our primary buffer, and if
1672 * it got full, then all bets are off
1676 sd_bus_message_unref(bus->wqueue[0]);
1677 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1687 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1690 return bus_socket_read_message(bus);
1693 int bus_rqueue_make_room(sd_bus *bus) {
1696 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1699 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1705 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1710 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1712 /* Note that the priority logic is only available on kdbus,
1713 * where the rqueue is unused. We check the rqueue here
1714 * anyway, because it's simple... */
1717 if (bus->rqueue_size > 0) {
1718 /* Dispatch a queued message */
1720 *m = bus->rqueue[0];
1722 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1726 /* Try to read a new message */
1727 r = bus_read_message(bus, hint_priority, priority);
1737 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie) {
1738 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1741 assert_return(m, -EINVAL);
1746 assert_return(!bus_pid_changed(bus), -ECHILD);
1748 if (!BUS_IS_OPEN(bus->state))
1752 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1759 /* If the cookie number isn't kept, then we know that no reply
1761 if (!cookie && !m->sealed)
1762 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1764 r = bus_seal_message(bus, m, 0);
1768 /* Remarshall if we have to. This will possibly unref the
1769 * message and place a replacement in m */
1770 r = bus_remarshal_message(bus, &m);
1774 /* If this is a reply and no reply was requested, then let's
1775 * suppress this, if we can */
1779 if (IN_SET(bus->state, BUS_RUNNING, BUS_HELLO) && bus->wqueue_size <= 0) {
1782 r = bus_write_message(bus, m, &idx);
1784 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
1785 bus_enter_closing(bus);
1792 if (idx < BUS_MESSAGE_SIZE(m)) {
1793 /* Wasn't fully written. So let's remember how
1794 * much was written. Note that the first entry
1795 * of the wqueue array is always allocated so
1796 * that we always can remember how much was
1798 bus->wqueue[0] = sd_bus_message_ref(m);
1799 bus->wqueue_size = 1;
1804 /* Just append it to the queue. */
1806 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1809 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1812 bus->wqueue[bus->wqueue_size++] = sd_bus_message_ref(m);
1817 *cookie = BUS_MESSAGE_COOKIE(m);
1822 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1825 assert_return(m, -EINVAL);
1830 assert_return(!bus_pid_changed(bus), -ECHILD);
1832 if (!BUS_IS_OPEN(bus->state))
1835 if (!streq_ptr(m->destination, destination)) {
1840 r = sd_bus_message_set_destination(m, destination);
1845 return sd_bus_send(bus, m, cookie);
1848 static usec_t calc_elapse(sd_bus *bus, uint64_t usec) {
1851 if (usec == (uint64_t) -1)
1854 /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
1855 * with any connection setup states. Hence, if a method callback is started earlier than that we just store the
1856 * relative timestamp, and afterwards the absolute one. */
1858 if (IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING))
1861 return now(CLOCK_MONOTONIC) + usec;
1864 static int timeout_compare(const void *a, const void *b) {
1865 const struct reply_callback *x = a, *y = b;
1867 if (x->timeout_usec != 0 && y->timeout_usec == 0)
1870 if (x->timeout_usec == 0 && y->timeout_usec != 0)
1873 if (x->timeout_usec < y->timeout_usec)
1876 if (x->timeout_usec > y->timeout_usec)
1882 _public_ int sd_bus_call_async(
1886 sd_bus_message_handler_t callback,
1890 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1891 _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *s = NULL;
1894 assert_return(m, -EINVAL);
1895 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1896 assert_return(!m->sealed || (!!callback == !(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)), -EINVAL);
1901 assert_return(!bus_pid_changed(bus), -ECHILD);
1903 if (!BUS_IS_OPEN(bus->state))
1906 /* If no callback is specified and there's no interest in a slot, then there's no reason to ask for a reply */
1907 if (!callback && !slot && !m->sealed)
1908 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1910 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
1914 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1918 r = bus_seal_message(bus, m, usec);
1922 r = bus_remarshal_message(bus, &m);
1926 if (slot || callback) {
1927 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
1931 s->reply_callback.callback = callback;
1933 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
1934 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
1936 s->reply_callback.cookie = 0;
1940 s->reply_callback.timeout_usec = calc_elapse(bus, m->timeout);
1941 if (s->reply_callback.timeout_usec != 0) {
1942 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
1944 s->reply_callback.timeout_usec = 0;
1950 r = sd_bus_send(bus, m, s ? &s->reply_callback.cookie : NULL);
1961 int bus_ensure_running(sd_bus *bus) {
1966 if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
1968 if (bus->state == BUS_RUNNING)
1972 r = sd_bus_process(bus, NULL);
1975 if (bus->state == BUS_RUNNING)
1980 r = sd_bus_wait(bus, (uint64_t) -1);
1986 _public_ int sd_bus_call(
1990 sd_bus_error *error,
1991 sd_bus_message **reply) {
1993 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1999 bus_assert_return(m, -EINVAL, error);
2000 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
2001 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
2002 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
2007 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
2009 if (!BUS_IS_OPEN(bus->state)) {
2014 r = bus_ensure_running(bus);
2018 i = bus->rqueue_size;
2020 r = bus_seal_message(bus, m, usec);
2024 r = bus_remarshal_message(bus, &m);
2028 r = sd_bus_send(bus, m, &cookie);
2032 timeout = calc_elapse(bus, m->timeout);
2037 while (i < bus->rqueue_size) {
2038 sd_bus_message *incoming = NULL;
2040 incoming = bus->rqueue[i];
2042 if (incoming->reply_cookie == cookie) {
2043 /* Found a match! */
2045 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2047 log_debug_bus_message(incoming);
2049 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2051 if (incoming->n_fds <= 0 || bus->accept_fd) {
2055 sd_bus_message_unref(incoming);
2060 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2061 sd_bus_message_unref(incoming);
2064 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
2065 r = sd_bus_error_copy(error, &incoming->error);
2066 sd_bus_message_unref(incoming);
2073 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2076 streq(bus->unique_name, incoming->sender)) {
2078 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2081 /* Our own message? Somebody is trying
2082 * to send its own client a message,
2083 * let's not dead-lock, let's fail
2086 sd_bus_message_unref(incoming);
2091 /* Try to read more, right-away */
2095 r = bus_read_message(bus, false, 0);
2097 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2098 bus_enter_closing(bus);
2110 n = now(CLOCK_MONOTONIC);
2118 left = (uint64_t) -1;
2120 r = bus_poll(bus, true, left);
2128 r = dispatch_wqueue(bus);
2130 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2131 bus_enter_closing(bus);
2140 return sd_bus_error_set_errno(error, r);
2143 _public_ int sd_bus_get_fd(sd_bus *bus) {
2145 assert_return(bus, -EINVAL);
2146 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2147 assert_return(!bus_pid_changed(bus), -ECHILD);
2149 if (bus->state == BUS_CLOSED)
2152 if (bus->inotify_fd >= 0)
2153 return bus->inotify_fd;
2155 if (bus->input_fd >= 0)
2156 return bus->input_fd;
2161 _public_ int sd_bus_get_events(sd_bus *bus) {
2164 assert_return(bus, -EINVAL);
2165 assert_return(!bus_pid_changed(bus), -ECHILD);
2167 switch (bus->state) {
2173 case BUS_WATCH_BIND:
2181 case BUS_AUTHENTICATING:
2182 if (bus_socket_auth_needs_write(bus))
2190 if (bus->rqueue_size <= 0)
2192 if (bus->wqueue_size > 0)
2200 assert_not_reached("Unknown state");
2206 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2207 struct reply_callback *c;
2209 assert_return(bus, -EINVAL);
2210 assert_return(timeout_usec, -EINVAL);
2211 assert_return(!bus_pid_changed(bus), -ECHILD);
2213 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2216 if (bus->track_queue) {
2221 switch (bus->state) {
2223 case BUS_AUTHENTICATING:
2224 *timeout_usec = bus->auth_timeout;
2229 if (bus->rqueue_size > 0) {
2234 c = prioq_peek(bus->reply_callbacks_prioq);
2236 *timeout_usec = (uint64_t) -1;
2240 if (c->timeout_usec == 0) {
2241 *timeout_usec = (uint64_t) -1;
2245 *timeout_usec = c->timeout_usec;
2252 case BUS_WATCH_BIND:
2254 *timeout_usec = (uint64_t) -1;
2258 assert_not_reached("Unknown or unexpected stat");
2262 static int process_timeout(sd_bus *bus) {
2263 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2264 _cleanup_(sd_bus_message_unrefp) sd_bus_message* m = NULL;
2265 struct reply_callback *c;
2272 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2274 c = prioq_peek(bus->reply_callbacks_prioq);
2278 n = now(CLOCK_MONOTONIC);
2279 if (c->timeout_usec > n)
2282 r = bus_message_new_synthetic_error(
2285 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2290 r = bus_seal_synthetic_message(bus, m);
2294 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2295 c->timeout_usec = 0;
2297 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2300 slot = container_of(c, sd_bus_slot, reply_callback);
2302 bus->iteration_counter++;
2304 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2306 bus->current_message = m;
2307 bus->current_slot = sd_bus_slot_ref(slot);
2308 bus->current_handler = c->callback;
2309 bus->current_userdata = slot->userdata;
2310 r = c->callback(m, slot->userdata, &error_buffer);
2311 bus->current_userdata = NULL;
2312 bus->current_handler = NULL;
2313 bus->current_slot = NULL;
2314 bus->current_message = NULL;
2316 if (slot->floating) {
2317 bus_slot_disconnect(slot);
2318 sd_bus_slot_unref(slot);
2321 sd_bus_slot_unref(slot);
2323 /* When this is the hello message and it timed out, then make sure to propagate the error up, don't just log
2324 * and ignore the callback handler's return value. */
2328 return bus_maybe_reply_error(m, r, &error_buffer);
2331 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2335 if (bus->state != BUS_HELLO)
2338 /* Let's make sure the first message on the bus is the HELLO
2339 * reply. But note that we don't actually parse the message
2340 * here (we leave that to the usual handling), we just verify
2341 * we don't let any earlier msg through. */
2343 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2346 if (m->reply_cookie != 1)
2352 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2353 _cleanup_(sd_bus_message_unrefp) sd_bus_message *synthetic_reply = NULL;
2354 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2355 struct reply_callback *c;
2363 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2366 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2369 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2375 slot = container_of(c, sd_bus_slot, reply_callback);
2377 if (m->n_fds > 0 && !bus->accept_fd) {
2379 /* If the reply contained a file descriptor which we
2380 * didn't want we pass an error instead. */
2382 r = bus_message_new_synthetic_error(
2385 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2390 /* Copy over original timestamp */
2391 synthetic_reply->realtime = m->realtime;
2392 synthetic_reply->monotonic = m->monotonic;
2393 synthetic_reply->seqnum = m->seqnum;
2395 r = bus_seal_synthetic_message(bus, synthetic_reply);
2399 m = synthetic_reply;
2401 r = sd_bus_message_rewind(m, true);
2406 if (c->timeout_usec != 0) {
2407 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2408 c->timeout_usec = 0;
2411 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2413 bus->current_slot = sd_bus_slot_ref(slot);
2414 bus->current_handler = c->callback;
2415 bus->current_userdata = slot->userdata;
2416 r = c->callback(m, slot->userdata, &error_buffer);
2417 bus->current_userdata = NULL;
2418 bus->current_handler = NULL;
2419 bus->current_slot = NULL;
2421 if (slot->floating) {
2422 bus_slot_disconnect(slot);
2423 sd_bus_slot_unref(slot);
2426 sd_bus_slot_unref(slot);
2428 /* When this is the hello message and it failed, then make sure to propagate the error up, don't just log and
2429 * ignore the callback handler's return value. */
2433 return bus_maybe_reply_error(m, r, &error_buffer);
2436 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2437 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2438 struct filter_callback *l;
2445 bus->filter_callbacks_modified = false;
2447 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2450 if (bus->filter_callbacks_modified)
2453 /* Don't run this more than once per iteration */
2454 if (l->last_iteration == bus->iteration_counter)
2457 l->last_iteration = bus->iteration_counter;
2459 r = sd_bus_message_rewind(m, true);
2463 slot = container_of(l, sd_bus_slot, filter_callback);
2465 bus->current_slot = sd_bus_slot_ref(slot);
2466 bus->current_handler = l->callback;
2467 bus->current_userdata = slot->userdata;
2468 r = l->callback(m, slot->userdata, &error_buffer);
2469 bus->current_userdata = NULL;
2470 bus->current_handler = NULL;
2471 bus->current_slot = sd_bus_slot_unref(slot);
2473 r = bus_maybe_reply_error(m, r, &error_buffer);
2479 } while (bus->filter_callbacks_modified);
2484 static int process_match(sd_bus *bus, sd_bus_message *m) {
2491 bus->match_callbacks_modified = false;
2493 r = bus_match_run(bus, &bus->match_callbacks, m);
2497 } while (bus->match_callbacks_modified);
2502 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2503 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
2509 if (bus->is_monitor)
2512 if (bus->manual_peer_interface)
2515 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2518 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2521 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2524 if (streq_ptr(m->member, "Ping"))
2525 r = sd_bus_message_new_method_return(m, &reply);
2526 else if (streq_ptr(m->member, "GetMachineId")) {
2530 r = sd_id128_get_machine(&id);
2534 r = sd_bus_message_new_method_return(m, &reply);
2538 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2540 r = sd_bus_message_new_method_errorf(
2542 SD_BUS_ERROR_UNKNOWN_METHOD,
2543 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2549 r = sd_bus_send(bus, reply, NULL);
2556 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2560 /* If we got a message with a file descriptor which we didn't
2561 * want to accept, then let's drop it. How can this even
2562 * happen? For example, when the kernel queues a message into
2563 * an activatable names's queue which allows fds, and then is
2564 * delivered to us later even though we ourselves did not
2567 if (bus->is_monitor)
2576 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2577 return 1; /* just eat it up */
2579 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2582 static int process_message(sd_bus *bus, sd_bus_message *m) {
2588 bus->current_message = m;
2589 bus->iteration_counter++;
2591 log_debug_bus_message(m);
2593 r = process_hello(bus, m);
2597 r = process_reply(bus, m);
2601 r = process_fd_check(bus, m);
2605 r = process_filter(bus, m);
2609 r = process_match(bus, m);
2613 r = process_builtin(bus, m);
2617 r = bus_process_object(bus, m);
2620 bus->current_message = NULL;
2624 static int dispatch_track(sd_bus *bus) {
2627 if (!bus->track_queue)
2630 bus_track_dispatch(bus->track_queue);
2634 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2635 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2639 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2641 r = process_timeout(bus);
2645 r = dispatch_wqueue(bus);
2649 r = dispatch_track(bus);
2653 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2659 r = process_message(bus, m);
2664 r = sd_bus_message_rewind(m, true);
2673 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2675 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2676 strna(sd_bus_message_get_sender(m)),
2677 strna(sd_bus_message_get_path(m)),
2678 strna(sd_bus_message_get_interface(m)),
2679 strna(sd_bus_message_get_member(m)));
2681 r = sd_bus_reply_method_errorf(
2683 SD_BUS_ERROR_UNKNOWN_OBJECT,
2684 "Unknown object '%s'.", m->path);
2698 static int bus_exit_now(sd_bus *bus) {
2701 /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
2702 * sd_event_exit(), otherwise invokes libc exit(). */
2704 if (bus->exited) /* did we already exit? */
2706 if (!bus->exit_triggered) /* was the exit condition triggered? */
2708 if (!bus->exit_on_disconnect) /* Shall we actually exit on disconnection? */
2711 bus->exited = true; /* never exit more than once */
2713 log_debug("Bus connection disconnected, exiting.");
2716 return sd_event_exit(bus->event, EXIT_FAILURE);
2720 assert_not_reached("exit() didn't exit?");
2723 static int process_closing_reply_callback(sd_bus *bus, struct reply_callback *c) {
2724 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2725 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2732 r = bus_message_new_synthetic_error(
2735 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2740 r = bus_seal_synthetic_message(bus, m);
2744 if (c->timeout_usec != 0) {
2745 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2746 c->timeout_usec = 0;
2749 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2752 slot = container_of(c, sd_bus_slot, reply_callback);
2754 bus->iteration_counter++;
2756 bus->current_message = m;
2757 bus->current_slot = sd_bus_slot_ref(slot);
2758 bus->current_handler = c->callback;
2759 bus->current_userdata = slot->userdata;
2760 r = c->callback(m, slot->userdata, &error_buffer);
2761 bus->current_userdata = NULL;
2762 bus->current_handler = NULL;
2763 bus->current_slot = NULL;
2764 bus->current_message = NULL;
2766 if (slot->floating) {
2767 bus_slot_disconnect(slot);
2768 sd_bus_slot_unref(slot);
2771 sd_bus_slot_unref(slot);
2773 return bus_maybe_reply_error(m, r, &error_buffer);
2776 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2777 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2778 struct reply_callback *c;
2782 assert(bus->state == BUS_CLOSING);
2784 /* First, fail all outstanding method calls */
2785 c = ordered_hashmap_first(bus->reply_callbacks);
2787 return process_closing_reply_callback(bus, c);
2789 /* Then, fake-drop all remaining bus tracking references */
2791 bus_track_close(bus->tracks);
2795 /* Then, synthesize a Disconnected message */
2796 r = sd_bus_message_new_signal(
2799 "/org/freedesktop/DBus/Local",
2800 "org.freedesktop.DBus.Local",
2805 bus_message_set_sender_local(bus, m);
2807 r = bus_seal_synthetic_message(bus, m);
2813 bus->current_message = m;
2814 bus->iteration_counter++;
2816 r = process_filter(bus, m);
2820 r = process_match(bus, m);
2824 /* Nothing else to do, exit now, if the condition holds */
2825 bus->exit_triggered = true;
2826 (void) bus_exit_now(bus);
2836 bus->current_message = NULL;
2841 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2842 BUS_DONT_DESTROY(bus);
2845 /* Returns 0 when we didn't do anything. This should cause the
2846 * caller to invoke sd_bus_wait() before returning the next
2847 * time. Returns > 0 when we did something, which possibly
2848 * means *ret is filled in with an unprocessed message. */
2850 assert_return(bus, -EINVAL);
2851 assert_return(!bus_pid_changed(bus), -ECHILD);
2853 /* We don't allow recursively invoking sd_bus_process(). */
2854 assert_return(!bus->current_message, -EBUSY);
2855 assert(!bus->current_slot);
2857 switch (bus->state) {
2865 case BUS_WATCH_BIND:
2866 r = bus_socket_process_watch_bind(bus);
2870 r = bus_socket_process_opening(bus);
2873 case BUS_AUTHENTICATING:
2874 r = bus_socket_process_authenticating(bus);
2879 r = process_running(bus, hint_priority, priority, ret);
2883 /* This branch initializes *ret, hence we don't use the generic error checking below */
2887 return process_closing(bus, ret);
2890 assert_not_reached("Unknown state");
2893 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2894 bus_enter_closing(bus);
2905 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2906 return bus_process_internal(bus, false, 0, ret);
2909 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2910 return bus_process_internal(bus, true, priority, ret);
2913 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2914 struct pollfd p[2] = {};
2917 usec_t m = USEC_INFINITY;
2921 if (bus->state == BUS_CLOSING)
2924 if (!BUS_IS_OPEN(bus->state))
2927 if (bus->state == BUS_WATCH_BIND) {
2928 assert(bus->inotify_fd >= 0);
2930 p[0].events = POLLIN;
2931 p[0].fd = bus->inotify_fd;
2936 e = sd_bus_get_events(bus);
2941 /* The caller really needs some more data, he doesn't
2942 * care about what's already read, or any timeouts
2943 * except its own. */
2947 /* The caller wants to process if there's something to
2948 * process, but doesn't care otherwise */
2950 r = sd_bus_get_timeout(bus, &until);
2954 m = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
2957 p[0].fd = bus->input_fd;
2958 if (bus->output_fd == bus->input_fd) {
2962 p[0].events = e & POLLIN;
2963 p[1].fd = bus->output_fd;
2964 p[1].events = e & POLLOUT;
2969 if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
2972 r = ppoll(p, n, m == USEC_INFINITY ? NULL : timespec_store(&ts, m), NULL);
2976 return r > 0 ? 1 : 0;
2979 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2981 assert_return(bus, -EINVAL);
2982 assert_return(!bus_pid_changed(bus), -ECHILD);
2984 if (bus->state == BUS_CLOSING)
2987 if (!BUS_IS_OPEN(bus->state))
2990 if (bus->rqueue_size > 0)
2993 return bus_poll(bus, false, timeout_usec);
2996 _public_ int sd_bus_flush(sd_bus *bus) {
2999 assert_return(bus, -EINVAL);
3000 assert_return(!bus_pid_changed(bus), -ECHILD);
3002 if (bus->state == BUS_CLOSING)
3005 if (!BUS_IS_OPEN(bus->state))
3008 /* We never were connected? Don't hang in inotify for good, as there's no timeout set for it */
3009 if (bus->state == BUS_WATCH_BIND)
3012 r = bus_ensure_running(bus);
3016 if (bus->wqueue_size <= 0)
3020 r = dispatch_wqueue(bus);
3022 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
3023 bus_enter_closing(bus);
3030 if (bus->wqueue_size <= 0)
3033 r = bus_poll(bus, false, (uint64_t) -1);
3039 _public_ int sd_bus_add_filter(
3042 sd_bus_message_handler_t callback,
3047 assert_return(bus, -EINVAL);
3048 assert_return(callback, -EINVAL);
3049 assert_return(!bus_pid_changed(bus), -ECHILD);
3051 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
3055 s->filter_callback.callback = callback;
3057 bus->filter_callbacks_modified = true;
3058 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
3066 static int add_match_callback(
3069 sd_bus_error *ret_error) {
3071 sd_bus_slot *match_slot = userdata;
3072 bool failed = false;
3078 sd_bus_slot_ref(match_slot);
3080 if (sd_bus_message_is_method_error(m, NULL)) {
3081 log_debug_errno(sd_bus_message_get_errno(m),
3082 "Unable to add match %s, failing connection: %s",
3083 match_slot->match_callback.match_string,
3084 sd_bus_message_get_error(m)->message);
3088 log_debug("Match %s successfully installed.", match_slot->match_callback.match_string);
3090 if (match_slot->match_callback.install_callback) {
3093 bus = sd_bus_message_get_bus(m);
3095 /* This function has been called as slot handler, and we want to call another slot handler. Let's
3096 * update the slot callback metadata temporarily with our own data, and then revert back to the old
3099 assert(bus->current_slot == match_slot->match_callback.install_slot);
3100 assert(bus->current_handler == add_match_callback);
3101 assert(bus->current_userdata == userdata);
3103 bus->current_slot = match_slot;
3104 bus->current_handler = match_slot->match_callback.install_callback;
3105 bus->current_userdata = match_slot->userdata;
3107 r = match_slot->match_callback.install_callback(m, match_slot->userdata, ret_error);
3109 bus->current_slot = match_slot->match_callback.install_slot;
3110 bus->current_handler = add_match_callback;
3111 bus->current_userdata = userdata;
3113 match_slot->match_callback.install_slot = sd_bus_slot_unref(match_slot->match_callback.install_slot);
3115 if (failed) /* Generic failure handling: destroy the connection */
3116 bus_enter_closing(sd_bus_message_get_bus(m));
3121 if (failed && match_slot->floating) {
3122 bus_slot_disconnect(match_slot);
3123 sd_bus_slot_unref(match_slot);
3126 sd_bus_slot_unref(match_slot);
3131 static int bus_add_match_full(
3136 sd_bus_message_handler_t callback,
3137 sd_bus_message_handler_t install_callback,
3140 struct bus_match_component *components = NULL;
3141 unsigned n_components = 0;
3142 sd_bus_slot *s = NULL;
3145 assert_return(bus, -EINVAL);
3146 assert_return(match, -EINVAL);
3147 assert_return(!bus_pid_changed(bus), -ECHILD);
3149 r = bus_match_parse(match, &components, &n_components);
3153 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
3159 s->match_callback.callback = callback;
3160 s->match_callback.install_callback = install_callback;
3162 if (bus->bus_client) {
3163 enum bus_match_scope scope;
3165 scope = bus_match_get_scope(components, n_components);
3167 /* Do not install server-side matches for matches against the local service, interface or bus path. */
3168 if (scope != BUS_MATCH_LOCAL) {
3170 /* We store the original match string, so that we can use it to remove the match again. */
3172 s->match_callback.match_string = strdup(match);
3173 if (!s->match_callback.match_string) {
3179 r = bus_add_match_internal_async(bus,
3180 &s->match_callback.install_slot,
3181 s->match_callback.match_string,
3185 r = bus_add_match_internal(bus, s->match_callback.match_string);
3189 s->match_added = true;
3193 bus->match_callbacks_modified = true;
3194 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3203 bus_match_parse_free(components, n_components);
3204 sd_bus_slot_unref(s);
3209 #if 0 /// UNNEEDED by elogind
3211 _public_ int sd_bus_add_match(
3215 sd_bus_message_handler_t callback,
3218 return bus_add_match_full(bus, slot, false, match, callback, NULL, userdata);
3221 _public_ int sd_bus_add_match_async(
3225 sd_bus_message_handler_t callback,
3226 sd_bus_message_handler_t install_callback,
3229 return bus_add_match_full(bus, slot, true, match, callback, install_callback, userdata);
3232 bool bus_pid_changed(sd_bus *bus) {
3235 /* We don't support people creating a bus connection and
3236 * keeping it around over a fork(). Let's complain. */
3238 return bus->original_pid != getpid_cached();
3241 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3242 sd_bus *bus = userdata;
3247 /* Note that this is called both on input_fd, output_fd as well as inotify_fd events */
3249 r = sd_bus_process(bus, NULL);
3251 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3252 bus_enter_closing(bus);
3258 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3259 sd_bus *bus = userdata;
3264 r = sd_bus_process(bus, NULL);
3266 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3267 bus_enter_closing(bus);
3273 static int prepare_callback(sd_event_source *s, void *userdata) {
3274 sd_bus *bus = userdata;
3281 e = sd_bus_get_events(bus);
3287 if (bus->output_fd != bus->input_fd) {
3289 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3293 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3295 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3299 r = sd_bus_get_timeout(bus, &until);
3305 j = sd_event_source_set_time(bus->time_event_source, until);
3312 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3319 log_debug_errno(r, "Preparing of bus events failed, closing down: %m");
3320 bus_enter_closing(bus);
3325 static int quit_callback(sd_event_source *event, void *userdata) {
3326 sd_bus *bus = userdata;
3336 int bus_attach_io_events(sd_bus *bus) {
3341 if (bus->input_fd < 0)
3347 if (!bus->input_io_event_source) {
3348 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3352 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3356 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3360 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3362 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3367 if (bus->output_fd != bus->input_fd) {
3368 assert(bus->output_fd >= 0);
3370 if (!bus->output_io_event_source) {
3371 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3375 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3379 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3381 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3390 static void bus_detach_io_events(sd_bus *bus) {
3393 if (bus->input_io_event_source) {
3394 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3395 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3398 if (bus->output_io_event_source) {
3399 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3400 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3404 int bus_attach_inotify_event(sd_bus *bus) {
3409 if (bus->inotify_fd < 0)
3415 if (!bus->inotify_event_source) {
3416 r = sd_event_add_io(bus->event, &bus->inotify_event_source, bus->inotify_fd, EPOLLIN, io_callback, bus);
3420 r = sd_event_source_set_priority(bus->inotify_event_source, bus->event_priority);
3424 r = sd_event_source_set_description(bus->inotify_event_source, "bus-inotify");
3426 r = sd_event_source_set_io_fd(bus->inotify_event_source, bus->inotify_fd);
3433 static void bus_detach_inotify_event(sd_bus *bus) {
3436 if (bus->inotify_event_source) {
3437 sd_event_source_set_enabled(bus->inotify_event_source, SD_EVENT_OFF);
3438 bus->inotify_event_source = sd_event_source_unref(bus->inotify_event_source);
3442 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3445 assert_return(bus, -EINVAL);
3446 assert_return(!bus->event, -EBUSY);
3448 assert(!bus->input_io_event_source);
3449 assert(!bus->output_io_event_source);
3450 assert(!bus->time_event_source);
3453 bus->event = sd_event_ref(event);
3455 r = sd_event_default(&bus->event);
3460 bus->event_priority = priority;
3462 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3466 r = sd_event_source_set_priority(bus->time_event_source, priority);
3470 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3474 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3478 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3482 r = bus_attach_io_events(bus);
3486 r = bus_attach_inotify_event(bus);
3493 sd_bus_detach_event(bus);
3497 _public_ int sd_bus_detach_event(sd_bus *bus) {
3498 assert_return(bus, -EINVAL);
3503 bus_detach_io_events(bus);
3504 bus_detach_inotify_event(bus);
3506 if (bus->time_event_source) {
3507 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3508 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3511 if (bus->quit_event_source) {
3512 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3513 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3516 bus->event = sd_event_unref(bus->event);
3520 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3521 assert_return(bus, NULL);
3526 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3527 assert_return(bus, NULL);
3529 return bus->current_message;
3532 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3533 assert_return(bus, NULL);
3535 return bus->current_slot;
3538 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3539 assert_return(bus, NULL);
3541 return bus->current_handler;
3544 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3545 assert_return(bus, NULL);
3547 return bus->current_userdata;
3550 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3555 assert(default_bus);
3558 return !!*default_bus;
3561 *ret = sd_bus_ref(*default_bus);
3569 b->default_bus_ptr = default_bus;
3577 _public_ int sd_bus_default_system(sd_bus **ret) {
3578 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3582 _public_ int sd_bus_default_user(sd_bus **ret) {
3583 #if 0 /// elogind does not support user buses
3584 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3586 return sd_bus_default_system(ret);
3590 _public_ int sd_bus_default(sd_bus **ret) {
3594 /* Let's try our best to reuse another cached connection. If
3595 * the starter bus type is set, connect via our normal
3596 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3597 * we can share the connection with the user/system default
3600 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3602 if (streq(e, "system"))
3603 return sd_bus_default_system(ret);
3604 #if 0 /// elogind does not support systemd units
3605 else if (STR_IN_SET(e, "user", "session"))
3606 return sd_bus_default_user(ret);
3610 /* No type is specified, so we have not other option than to
3611 * use the starter address if it is set. */
3612 e = secure_getenv("DBUS_STARTER_ADDRESS");
3614 return bus_default(sd_bus_open, &default_starter_bus, ret);
3616 /* Finally, if nothing is set use the cached connection for
3617 * the right scope */
3619 #if 0 /// elogind does not support systemd user instances
3620 if (cg_pid_get_owner_uid(0, NULL) >= 0)
3621 return sd_bus_default_user(ret);
3624 return sd_bus_default_system(ret);
3627 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3628 assert_return(b, -EINVAL);
3629 assert_return(tid, -EINVAL);
3630 assert_return(!bus_pid_changed(b), -ECHILD);
3638 return sd_event_get_tid(b->event, tid);
3643 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3644 _cleanup_free_ char *e = NULL;
3647 assert_return(object_path_is_valid(prefix), -EINVAL);
3648 assert_return(external_id, -EINVAL);
3649 assert_return(ret_path, -EINVAL);
3651 e = bus_label_escape(external_id);
3655 ret = strjoin(prefix, "/", e);
3663 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3667 assert_return(object_path_is_valid(path), -EINVAL);
3668 assert_return(object_path_is_valid(prefix), -EINVAL);
3669 assert_return(external_id, -EINVAL);
3671 e = object_path_startswith(path, prefix);
3673 *external_id = NULL;
3677 ret = bus_label_unescape(e);
3685 _public_ int sd_bus_path_encode_many(char **out, const char *path_template, ...) {
3686 _cleanup_strv_free_ char **labels = NULL;
3687 char *path, *path_pos, **label_pos;
3688 const char *sep, *template_pos;
3693 assert_return(out, -EINVAL);
3694 assert_return(path_template, -EINVAL);
3696 path_length = strlen(path_template);
3698 va_start(list, path_template);
3699 for (sep = strchr(path_template, '%'); sep; sep = strchr(sep + 1, '%')) {
3703 arg = va_arg(list, const char *);
3709 label = bus_label_escape(arg);
3715 r = strv_consume(&labels, label);
3721 /* add label length, but account for the format character */
3722 path_length += strlen(label) - 1;
3726 path = malloc(path_length + 1);
3733 for (template_pos = path_template; *template_pos; ) {
3734 sep = strchrnul(template_pos, '%');
3735 path_pos = mempcpy(path_pos, template_pos, sep - template_pos);
3739 path_pos = stpcpy(path_pos, *label_pos++);
3740 template_pos = sep + 1;
3748 _public_ int sd_bus_path_decode_many(const char *path, const char *path_template, ...) {
3749 _cleanup_strv_free_ char **labels = NULL;
3750 const char *template_pos, *path_pos;
3756 * This decodes an object-path based on a template argument. The
3757 * template consists of a verbatim path, optionally including special
3760 * - Each occurrence of '%' in the template matches an arbitrary
3761 * substring of a label in the given path. At most one such
3762 * directive is allowed per label. For each such directive, the
3763 * caller must provide an output parameter (char **) via va_arg. If
3764 * NULL is passed, the given label is verified, but not returned.
3765 * For each matched label, the *decoded* label is stored in the
3766 * passed output argument, and the caller is responsible to free
3767 * it. Note that the output arguments are only modified if the
3768 * actualy path matched the template. Otherwise, they're left
3771 * This function returns <0 on error, 0 if the path does not match the
3772 * template, 1 if it matched.
3775 assert_return(path, -EINVAL);
3776 assert_return(path_template, -EINVAL);
3780 for (template_pos = path_template; *template_pos; ) {
3785 /* verify everything until the next '%' matches verbatim */
3786 sep = strchrnul(template_pos, '%');
3787 length = sep - template_pos;
3788 if (strncmp(path_pos, template_pos, length))
3792 template_pos += length;
3797 /* We found the next '%' character. Everything up until here
3798 * matched. We now skip ahead to the end of this label and make
3799 * sure it matches the tail of the label in the path. Then we
3800 * decode the string in-between and save it for later use. */
3802 ++template_pos; /* skip over '%' */
3804 sep = strchrnul(template_pos, '/');
3805 length = sep - template_pos; /* length of suffix to match verbatim */
3807 /* verify the suffixes match */
3808 sep = strchrnul(path_pos, '/');
3809 if (sep - path_pos < (ssize_t)length ||
3810 strncmp(sep - length, template_pos, length))
3813 template_pos += length; /* skip over matched label */
3814 length = sep - path_pos - length; /* length of sub-label to decode */
3816 /* store unescaped label for later use */
3817 label = bus_label_unescape_n(path_pos, length);
3821 r = strv_consume(&labels, label);
3825 path_pos = sep; /* skip decoded label and suffix */
3828 /* end of template must match end of path */
3832 /* copy the labels over to the caller */
3833 va_start(list, path_template);
3834 for (label_pos = labels; label_pos && *label_pos; ++label_pos) {
3837 arg = va_arg(list, char **);
3845 labels = mfree(labels);
3849 _public_ int sd_bus_try_close(sd_bus *bus) {
3850 assert_return(bus, -EINVAL);
3851 assert_return(!bus_pid_changed(bus), -ECHILD);
3856 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3857 assert_return(bus, -EINVAL);
3858 assert_return(description, -EINVAL);
3859 assert_return(bus->description, -ENXIO);
3860 assert_return(!bus_pid_changed(bus), -ECHILD);
3862 *description = bus->description;
3866 int bus_get_root_path(sd_bus *bus) {
3869 if (bus->cgroup_root)
3872 r = cg_get_root_path(&bus->cgroup_root);
3874 bus->cgroup_root = strdup("/");
3875 if (!bus->cgroup_root)
3884 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3885 assert_return(bus, -EINVAL);
3886 assert_return(scope, -EINVAL);
3887 assert_return(!bus_pid_changed(bus), -ECHILD);
3894 if (bus->is_system) {
3902 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3904 assert_return(bus, -EINVAL);
3905 assert_return(address, -EINVAL);
3906 assert_return(!bus_pid_changed(bus), -ECHILD);
3909 *address = bus->address;
3916 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
3917 assert_return(bus, -EINVAL);
3918 assert_return(mask, -EINVAL);
3919 assert_return(!bus_pid_changed(bus), -ECHILD);
3921 *mask = bus->creds_mask;
3925 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
3926 assert_return(bus, -EINVAL);
3927 assert_return(!bus_pid_changed(bus), -ECHILD);
3929 return bus->bus_client;
3932 _public_ int sd_bus_is_server(sd_bus *bus) {
3933 assert_return(bus, -EINVAL);
3934 assert_return(!bus_pid_changed(bus), -ECHILD);
3936 return bus->is_server;
3939 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
3940 assert_return(bus, -EINVAL);
3941 assert_return(!bus_pid_changed(bus), -ECHILD);
3943 return bus->anonymous_auth;
3946 _public_ int sd_bus_is_trusted(sd_bus *bus) {
3947 assert_return(bus, -EINVAL);
3948 assert_return(!bus_pid_changed(bus), -ECHILD);
3950 return bus->trusted;
3953 _public_ int sd_bus_is_monitor(sd_bus *bus) {
3954 assert_return(bus, -EINVAL);
3955 assert_return(!bus_pid_changed(bus), -ECHILD);
3957 return bus->is_monitor;
3960 static void flush_close(sd_bus *bus) {
3964 /* Flushes and closes the specified bus. We take a ref before,
3965 * to ensure the flushing does not cause the bus to be
3968 sd_bus_flush_close_unref(sd_bus_ref(bus));
3971 _public_ void sd_bus_default_flush_close(void) {
3972 flush_close(default_starter_bus);
3973 #if 0 /// elogind does not support user buses
3974 flush_close(default_user_bus);
3976 flush_close(default_system_bus);
3979 _public_ int sd_bus_set_exit_on_disconnect(sd_bus *bus, int b) {
3980 assert_return(bus, -EINVAL);
3982 /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
3983 * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
3984 * from the client side. */
3985 bus->exit_on_disconnect = b;
3987 /* If the exit condition was triggered already, exit immediately. */
3988 return bus_exit_now(bus);
3991 _public_ int sd_bus_get_exit_on_disconnect(sd_bus *bus) {
3992 assert_return(bus, -EINVAL);
3994 return bus->exit_on_disconnect;
3997 _public_ int sd_bus_set_sender(sd_bus *bus, const char *sender) {
3998 assert_return(bus, -EINVAL);
3999 assert_return(!bus->bus_client, -EPERM);
4000 assert_return(!sender || service_name_is_valid(sender), -EINVAL);
4002 return free_and_strdup(&bus->patch_sender, sender);
4005 _public_ int sd_bus_get_sender(sd_bus *bus, const char **ret) {
4006 assert_return(bus, -EINVAL);
4007 assert_return(ret, -EINVAL);
4009 if (!bus->patch_sender)
4012 *ret = bus->patch_sender;