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 static sd_bus **bus_choose_default(int (**bus_open)(sd_bus **)) {
91 /* Let's try our best to reuse another cached connection. If
92 * the starter bus type is set, connect via our normal
93 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
94 * we can share the connection with the user/system default
97 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
99 if (streq(e, "system")) {
101 *bus_open = sd_bus_open_system;
102 return &default_system_bus;
103 } else if (STR_IN_SET(e, "user", "session")) {
105 *bus_open = sd_bus_open_user;
106 return &default_user_bus;
110 /* No type is specified, so we have not other option than to
111 * use the starter address if it is set. */
112 e = secure_getenv("DBUS_STARTER_ADDRESS");
115 *bus_open = sd_bus_open;
116 return &default_starter_bus;
119 /* Finally, if nothing is set use the cached connection for
122 if (cg_pid_get_owner_uid(0, NULL) >= 0) {
124 *bus_open = sd_bus_open_user;
125 return &default_user_bus;
128 *bus_open = sd_bus_open_system;
129 return &default_system_bus;
133 sd_bus *bus_resolve(sd_bus *bus) {
134 switch ((uintptr_t) bus) {
135 case (uintptr_t) SD_BUS_DEFAULT:
136 return *(bus_choose_default(NULL));
137 case (uintptr_t) SD_BUS_DEFAULT_USER:
138 return default_user_bus;
139 case (uintptr_t) SD_BUS_DEFAULT_SYSTEM:
140 return default_system_bus;
146 void bus_close_io_fds(sd_bus *b) {
149 bus_detach_io_events(b);
151 if (b->input_fd != b->output_fd)
152 safe_close(b->output_fd);
153 b->output_fd = b->input_fd = safe_close(b->input_fd);
156 void bus_close_inotify_fd(sd_bus *b) {
159 bus_detach_inotify_event(b);
161 b->inotify_fd = safe_close(b->inotify_fd);
162 b->inotify_watches = mfree(b->inotify_watches);
163 b->n_inotify_watches = 0;
166 static void bus_reset_queues(sd_bus *b) {
169 while (b->rqueue_size > 0)
170 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
172 b->rqueue = mfree(b->rqueue);
173 b->rqueue_allocated = 0;
175 while (b->wqueue_size > 0)
176 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
178 b->wqueue = mfree(b->wqueue);
179 b->wqueue_allocated = 0;
182 static void bus_free(sd_bus *b) {
186 assert(!b->track_queue);
189 b->state = BUS_CLOSED;
191 sd_bus_detach_event(b);
193 while ((s = b->slots)) {
194 /* At this point only floating slots can still be
195 * around, because the non-floating ones keep a
196 * reference to the bus, and we thus couldn't be
197 * destructing right now... We forcibly disconnect the
198 * slots here, so that they still can be referenced by
199 * apps, but are dead. */
202 bus_slot_disconnect(s);
203 sd_bus_slot_unref(s);
206 if (b->default_bus_ptr)
207 *b->default_bus_ptr = NULL;
210 bus_close_inotify_fd(b);
215 free(b->unique_name);
216 free(b->auth_buffer);
219 free(b->cgroup_root);
220 free(b->description);
221 free(b->patch_sender);
224 strv_free(b->exec_argv);
226 close_many(b->fds, b->n_fds);
231 ordered_hashmap_free_free(b->reply_callbacks);
232 prioq_free(b->reply_callbacks_prioq);
234 assert(b->match_callbacks.type == BUS_MATCH_ROOT);
235 bus_match_free(&b->match_callbacks);
237 hashmap_free_free(b->vtable_methods);
238 hashmap_free_free(b->vtable_properties);
240 assert(hashmap_isempty(b->nodes));
241 hashmap_free(b->nodes);
245 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
250 _public_ int sd_bus_new(sd_bus **ret) {
253 assert_return(ret, -EINVAL);
259 r->n_ref = REFCNT_INIT;
260 r->input_fd = r->output_fd = -1;
262 r->message_version = 1;
263 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
265 r->original_pid = getpid_cached();
266 r->n_groups = (size_t) -1;
268 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
270 /* We guarantee that wqueue always has space for at least one
272 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
281 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
284 assert_return(bus, -EINVAL);
285 assert_return(bus = bus_resolve(bus), -ENOPKG);
286 assert_return(bus->state == BUS_UNSET, -EPERM);
287 assert_return(address, -EINVAL);
288 assert_return(!bus_pid_changed(bus), -ECHILD);
300 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
301 assert_return(bus, -EINVAL);
302 assert_return(bus = bus_resolve(bus), -ENOPKG);
303 assert_return(bus->state == BUS_UNSET, -EPERM);
304 assert_return(input_fd >= 0, -EBADF);
305 assert_return(output_fd >= 0, -EBADF);
306 assert_return(!bus_pid_changed(bus), -ECHILD);
308 bus->input_fd = input_fd;
309 bus->output_fd = output_fd;
313 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
316 assert_return(bus, -EINVAL);
317 assert_return(bus = bus_resolve(bus), -ENOPKG);
318 assert_return(bus->state == BUS_UNSET, -EPERM);
319 assert_return(path, -EINVAL);
320 assert_return(!strv_isempty(argv), -EINVAL);
321 assert_return(!bus_pid_changed(bus), -ECHILD);
333 free(bus->exec_path);
334 strv_free(bus->exec_argv);
342 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
343 assert_return(bus, -EINVAL);
344 assert_return(bus = bus_resolve(bus), -ENOPKG);
345 assert_return(bus->state == BUS_UNSET, -EPERM);
346 assert_return(!bus->patch_sender, -EPERM);
347 assert_return(!bus_pid_changed(bus), -ECHILD);
349 bus->bus_client = !!b;
353 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
354 assert_return(bus, -EINVAL);
355 assert_return(bus = bus_resolve(bus), -ENOPKG);
356 assert_return(bus->state == BUS_UNSET, -EPERM);
357 assert_return(!bus_pid_changed(bus), -ECHILD);
363 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
364 assert_return(bus, -EINVAL);
365 assert_return(bus = bus_resolve(bus), -ENOPKG);
366 assert_return(bus->state == BUS_UNSET, -EPERM);
367 assert_return(!bus_pid_changed(bus), -ECHILD);
373 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
374 assert_return(bus, -EINVAL);
375 assert_return(bus = bus_resolve(bus), -ENOPKG);
376 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
377 assert_return(!bus_pid_changed(bus), -ECHILD);
379 /* This is not actually supported by any of our transports these days, but we do honour it for synthetic
380 * replies, and maybe one day classic D-Bus learns this too */
381 bus->attach_timestamp = b;
386 _public_ int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t mask) {
387 assert_return(bus, -EINVAL);
388 assert_return(bus = bus_resolve(bus), -ENOPKG);
389 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
390 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
391 assert_return(!bus_pid_changed(bus), -ECHILD);
393 SET_FLAG(bus->creds_mask, mask, b);
395 /* The well knowns we need unconditionally, so that matches can work */
396 bus->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
401 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
402 assert_return(bus, -EINVAL);
403 assert_return(bus = bus_resolve(bus), -ENOPKG);
404 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
405 assert_return(bus->state == BUS_UNSET, -EPERM);
406 assert_return(!bus_pid_changed(bus), -ECHILD);
408 bus->is_server = !!b;
409 bus->server_id = server_id;
413 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
414 assert_return(bus, -EINVAL);
415 assert_return(bus = bus_resolve(bus), -ENOPKG);
416 assert_return(bus->state == BUS_UNSET, -EPERM);
417 assert_return(!bus_pid_changed(bus), -ECHILD);
419 bus->anonymous_auth = !!b;
423 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
424 assert_return(bus, -EINVAL);
425 assert_return(bus = bus_resolve(bus), -ENOPKG);
426 assert_return(bus->state == BUS_UNSET, -EPERM);
427 assert_return(!bus_pid_changed(bus), -ECHILD);
433 _public_ int sd_bus_set_description(sd_bus *bus, const char *description) {
434 assert_return(bus, -EINVAL);
435 assert_return(bus = bus_resolve(bus), -ENOPKG);
436 assert_return(bus->state == BUS_UNSET, -EPERM);
437 assert_return(!bus_pid_changed(bus), -ECHILD);
439 return free_and_strdup(&bus->description, description);
442 _public_ int sd_bus_set_allow_interactive_authorization(sd_bus *bus, int b) {
443 assert_return(bus, -EINVAL);
444 assert_return(bus = bus_resolve(bus), -ENOPKG);
445 assert_return(!bus_pid_changed(bus), -ECHILD);
447 bus->allow_interactive_authorization = !!b;
451 _public_ int sd_bus_get_allow_interactive_authorization(sd_bus *bus) {
452 assert_return(bus, -EINVAL);
453 assert_return(bus = bus_resolve(bus), -ENOPKG);
454 assert_return(!bus_pid_changed(bus), -ECHILD);
456 return bus->allow_interactive_authorization;
459 _public_ int sd_bus_set_watch_bind(sd_bus *bus, int b) {
460 assert_return(bus, -EINVAL);
461 assert_return(bus = bus_resolve(bus), -ENOPKG);
462 assert_return(bus->state == BUS_UNSET, -EPERM);
463 assert_return(!bus_pid_changed(bus), -ECHILD);
469 _public_ int sd_bus_get_watch_bind(sd_bus *bus) {
470 assert_return(bus, -EINVAL);
471 assert_return(bus = bus_resolve(bus), -ENOPKG);
472 assert_return(!bus_pid_changed(bus), -ECHILD);
474 return bus->watch_bind;
477 _public_ int sd_bus_set_connected_signal(sd_bus *bus, int b) {
478 assert_return(bus, -EINVAL);
479 assert_return(bus = bus_resolve(bus), -ENOPKG);
480 assert_return(bus->state == BUS_UNSET, -EPERM);
481 assert_return(!bus_pid_changed(bus), -ECHILD);
483 bus->connected_signal = b;
487 _public_ int sd_bus_get_connected_signal(sd_bus *bus) {
488 assert_return(bus, -EINVAL);
489 assert_return(bus = bus_resolve(bus), -ENOPKG);
490 assert_return(!bus_pid_changed(bus), -ECHILD);
492 return bus->connected_signal;
495 static int synthesize_connected_signal(sd_bus *bus) {
496 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
501 /* If enabled, synthesizes a local "Connected" signal mirroring the local "Disconnected" signal. This is called
502 * whenever we fully established a connection, i.e. after the authorization phase, and after receiving the
503 * Hello() reply. Or in other words, whenver we enter BUS_RUNNING state.
505 * This is useful so that clients can start doing stuff whenver the connection is fully established in a way
506 * that works independently from whether we connected to a full bus or just a direct connection. */
508 if (!bus->connected_signal)
511 r = sd_bus_message_new_signal(
514 "/org/freedesktop/DBus/Local",
515 "org.freedesktop.DBus.Local",
520 bus_message_set_sender_local(bus, m);
522 r = bus_seal_synthetic_message(bus, m);
526 r = bus_rqueue_make_room(bus);
530 /* Insert at the very front */
531 memmove(bus->rqueue + 1, bus->rqueue, sizeof(sd_bus_message*) * bus->rqueue_size);
539 void bus_set_state(sd_bus *bus, enum bus_state state) {
541 static const char * const table[_BUS_STATE_MAX] = {
542 [BUS_UNSET] = "UNSET",
543 [BUS_WATCH_BIND] = "WATCH_BIND",
544 [BUS_OPENING] = "OPENING",
545 [BUS_AUTHENTICATING] = "AUTHENTICATING",
546 [BUS_HELLO] = "HELLO",
547 [BUS_RUNNING] = "RUNNING",
548 [BUS_CLOSING] = "CLOSING",
549 [BUS_CLOSED] = "CLOSED",
553 assert(state < _BUS_STATE_MAX);
555 if (state == bus->state)
558 log_debug("Bus %s: changing state %s → %s", strna(bus->description), table[bus->state], table[state]);
562 static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) {
570 assert(IN_SET(bus->state, BUS_HELLO, BUS_CLOSING));
572 r = sd_bus_message_get_errno(reply);
576 r = sd_bus_message_read(reply, "s", &s);
580 if (!service_name_is_valid(s) || s[0] != ':')
583 bus->unique_name = strdup(s);
584 if (!bus->unique_name)
587 if (bus->state == BUS_HELLO) {
588 bus_set_state(bus, BUS_RUNNING);
590 r = synthesize_connected_signal(bus);
598 static int bus_send_hello(sd_bus *bus) {
599 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
604 if (!bus->bus_client)
607 r = sd_bus_message_new_method_call(
610 "org.freedesktop.DBus",
611 "/org/freedesktop/DBus",
612 "org.freedesktop.DBus",
617 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
620 int bus_start_running(sd_bus *bus) {
621 struct reply_callback *c;
627 assert(bus->state < BUS_HELLO);
629 /* We start all method call timeouts when we enter BUS_HELLO or BUS_RUNNING mode. At this point let's convert
630 * all relative to absolute timestamps. Note that we do not reshuffle the reply callback priority queue since
631 * adding a fixed value to all entries should not alter the internal order. */
633 n = now(CLOCK_MONOTONIC);
634 ORDERED_HASHMAP_FOREACH(c, bus->reply_callbacks, i) {
635 if (c->timeout_usec == 0)
638 c->timeout_usec = usec_add(n, c->timeout_usec);
641 if (bus->bus_client) {
642 bus_set_state(bus, BUS_HELLO);
646 bus_set_state(bus, BUS_RUNNING);
648 r = synthesize_connected_signal(bus);
655 static int parse_address_key(const char **p, const char *key, char **value) {
656 size_t l, n = 0, allocated = 0;
666 if (strncmp(*p, key, l) != 0)
679 while (!IN_SET(*a, ';', ',', 0)) {
697 c = (char) ((x << 4) | y);
704 if (!GREEDY_REALLOC(r, allocated, n + 2))
728 static void skip_address_key(const char **p) {
732 *p += strcspn(*p, ",");
738 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
739 _cleanup_free_ char *path = NULL, *abstract = NULL;
748 while (!IN_SET(**p, 0, ';')) {
749 r = parse_address_key(p, "guid", guid);
755 r = parse_address_key(p, "path", &path);
761 r = parse_address_key(p, "abstract", &abstract);
770 if (!path && !abstract)
773 if (path && abstract)
778 if (l > sizeof(b->sockaddr.un.sun_path))
781 b->sockaddr.un.sun_family = AF_UNIX;
782 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
783 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
784 } else if (abstract) {
785 l = strlen(abstract);
786 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
789 b->sockaddr.un.sun_family = AF_UNIX;
790 b->sockaddr.un.sun_path[0] = 0;
791 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
792 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
800 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
801 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
803 struct addrinfo *result, hints = {
804 .ai_socktype = SOCK_STREAM,
805 .ai_flags = AI_ADDRCONFIG,
813 while (!IN_SET(**p, 0, ';')) {
814 r = parse_address_key(p, "guid", guid);
820 r = parse_address_key(p, "host", &host);
826 r = parse_address_key(p, "port", &port);
832 r = parse_address_key(p, "family", &family);
845 if (streq(family, "ipv4"))
846 hints.ai_family = AF_INET;
847 else if (streq(family, "ipv6"))
848 hints.ai_family = AF_INET6;
853 r = getaddrinfo(host, port, &hints, &result);
857 return -EADDRNOTAVAIL;
859 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
860 b->sockaddr_size = result->ai_addrlen;
862 freeaddrinfo(result);
869 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
871 unsigned n_argv = 0, j;
873 size_t allocated = 0;
881 while (!IN_SET(**p, 0, ';')) {
882 r = parse_address_key(p, "guid", guid);
888 r = parse_address_key(p, "path", &path);
894 if (startswith(*p, "argv")) {
898 ul = strtoul(*p + 4, (char**) p, 10);
899 if (errno > 0 || **p != '=' || ul > 256) {
907 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
915 r = parse_address_key(p, NULL, argv + ul);
930 /* Make sure there are no holes in the array, with the
931 * exception of argv[0] */
932 for (j = 1; j < n_argv; j++)
938 if (argv && argv[0] == NULL) {
939 argv[0] = strdup(path);
954 for (j = 0; j < n_argv; j++)
962 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
963 _cleanup_free_ char *machine = NULL, *pid = NULL;
971 while (!IN_SET(**p, 0, ';')) {
972 r = parse_address_key(p, "guid", guid);
978 r = parse_address_key(p, "machine", &machine);
984 r = parse_address_key(p, "pid", &pid);
993 if (!machine == !pid)
997 if (!machine_name_is_valid(machine))
1000 free_and_replace(b->machine, machine);
1002 b->machine = mfree(b->machine);
1006 r = parse_pid(pid, &b->nspid);
1012 b->sockaddr.un.sun_family = AF_UNIX;
1013 /* Note that we use the old /var/run prefix here, to increase compatibility with really old containers */
1014 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
1015 b->sockaddr_size = SOCKADDR_UN_LEN(b->sockaddr.un);
1016 b->is_local = false;
1021 static void bus_reset_parsed_address(sd_bus *b) {
1025 b->sockaddr_size = 0;
1026 b->exec_argv = strv_free(b->exec_argv);
1027 b->exec_path = mfree(b->exec_path);
1028 b->server_id = SD_ID128_NULL;
1029 b->machine = mfree(b->machine);
1033 static int bus_parse_next_address(sd_bus *b) {
1034 _cleanup_free_ char *guid = NULL;
1042 if (b->address[b->address_index] == 0)
1045 bus_reset_parsed_address(b);
1047 a = b->address + b->address_index;
1056 if (startswith(a, "unix:")) {
1059 r = parse_unix_address(b, &a, &guid);
1064 } else if (startswith(a, "tcp:")) {
1067 r = parse_tcp_address(b, &a, &guid);
1073 } else if (startswith(a, "unixexec:")) {
1076 r = parse_exec_address(b, &a, &guid);
1082 } else if (startswith(a, "x-machine-unix:")) {
1085 r = parse_container_unix_address(b, &a, &guid);
1098 r = sd_id128_from_string(guid, &b->server_id);
1103 b->address_index = a - b->address;
1107 static int bus_start_address(sd_bus *b) {
1113 bus_close_io_fds(b);
1114 bus_close_inotify_fd(b);
1116 /* If you provide multiple different bus-addresses, we
1117 * try all of them in order and use the first one that
1121 r = bus_socket_exec(b);
1122 else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC)
1123 r = bus_container_connect_socket(b);
1124 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
1125 r = bus_socket_connect(b);
1132 q = bus_attach_io_events(b);
1136 q = bus_attach_inotify_event(b);
1143 b->last_connect_error = -r;
1146 r = bus_parse_next_address(b);
1150 return b->last_connect_error > 0 ? -b->last_connect_error : -ECONNREFUSED;
1154 int bus_next_address(sd_bus *b) {
1157 bus_reset_parsed_address(b);
1158 return bus_start_address(b);
1161 static int bus_start_fd(sd_bus *b) {
1166 assert(b->input_fd >= 0);
1167 assert(b->output_fd >= 0);
1169 r = fd_nonblock(b->input_fd, true);
1173 r = fd_cloexec(b->input_fd, true);
1177 if (b->input_fd != b->output_fd) {
1178 r = fd_nonblock(b->output_fd, true);
1182 r = fd_cloexec(b->output_fd, true);
1187 if (fstat(b->input_fd, &st) < 0)
1190 return bus_socket_take_fd(b);
1193 _public_ int sd_bus_start(sd_bus *bus) {
1196 assert_return(bus, -EINVAL);
1197 assert_return(bus = bus_resolve(bus), -ENOPKG);
1198 assert_return(bus->state == BUS_UNSET, -EPERM);
1199 assert_return(!bus_pid_changed(bus), -ECHILD);
1201 bus_set_state(bus, BUS_OPENING);
1203 if (bus->is_server && bus->bus_client)
1206 if (bus->input_fd >= 0)
1207 r = bus_start_fd(bus);
1208 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->machine)
1209 r = bus_start_address(bus);
1218 return bus_send_hello(bus);
1221 _public_ int sd_bus_open(sd_bus **ret) {
1226 assert_return(ret, -EINVAL);
1228 /* Let's connect to the starter bus if it is set, and
1229 * otherwise to the bus that is appropropriate for the scope
1230 * we are running in */
1232 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1234 if (streq(e, "system"))
1235 return sd_bus_open_system(ret);
1236 #if 0 /// elogind does not support systemd user instances
1237 else if (STR_IN_SET(e, "session", "user"))
1238 return sd_bus_open_user(ret);
1242 e = secure_getenv("DBUS_STARTER_ADDRESS");
1244 #if 0 /// elogind does not support systemd user instances
1245 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1246 return sd_bus_open_user(ret);
1249 return sd_bus_open_system(ret);
1256 r = sd_bus_set_address(b, e);
1260 b->bus_client = true;
1262 /* We don't know whether the bus is trusted or not, so better
1263 * be safe, and authenticate everything */
1265 b->is_local = false;
1266 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1268 r = sd_bus_start(b);
1280 int bus_set_address_system(sd_bus *b) {
1284 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1286 return sd_bus_set_address(b, e);
1288 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1291 _public_ int sd_bus_open_system(sd_bus **ret) {
1295 assert_return(ret, -EINVAL);
1301 r = bus_set_address_system(b);
1305 b->bus_client = true;
1306 b->is_system = true;
1308 /* Let's do per-method access control on the system bus. We
1309 * need the caller's UID and capability set for that. */
1311 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1314 r = sd_bus_start(b);
1326 #if 0 /// elogind can not open/use a user bus
1327 int bus_set_address_user(sd_bus *b) {
1329 _cleanup_free_ char *ee = NULL, *s = NULL;
1333 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1335 return sd_bus_set_address(b, e);
1337 e = secure_getenv("XDG_RUNTIME_DIR");
1341 ee = bus_address_escape(e);
1345 if (asprintf(&s, DEFAULT_USER_BUS_ADDRESS_FMT, ee) < 0)
1355 _public_ int sd_bus_open_user(sd_bus **ret) {
1356 #if 0 /// elogind does not support user buses
1360 assert_return(ret, -EINVAL);
1366 r = bus_set_address_user(b);
1370 b->bus_client = true;
1373 /* We don't do any per-method access control on the user
1378 r = sd_bus_start(b);
1389 return sd_bus_open_system(ret);
1393 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1394 _cleanup_free_ char *e = NULL;
1395 char *m = NULL, *c = NULL;
1400 /* Let's see if we shall enter some container */
1401 m = strchr(host, ':');
1405 /* Let's make sure this is not a port of some kind,
1406 * and is a valid machine name. */
1407 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1410 /* Cut out the host part */
1411 t = strndupa(host, m - host - 1);
1412 e = bus_address_escape(t);
1416 c = strjoina(",argv5=--machine=", m);
1421 e = bus_address_escape(host);
1426 b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e, ",argv4=systemd-stdio-bridge", c);
1433 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1437 assert_return(host, -EINVAL);
1438 assert_return(ret, -EINVAL);
1440 r = sd_bus_new(&bus);
1444 r = bus_set_address_system_remote(bus, host);
1448 bus->bus_client = true;
1449 bus->trusted = false;
1450 bus->is_system = true;
1451 bus->is_local = false;
1453 r = sd_bus_start(bus);
1465 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1466 _cleanup_free_ char *e = NULL;
1471 e = bus_address_escape(machine);
1475 b->address = strjoin("x-machine-unix:machine=", e);
1482 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1486 assert_return(machine, -EINVAL);
1487 assert_return(ret, -EINVAL);
1488 assert_return(machine_name_is_valid(machine), -EINVAL);
1490 r = sd_bus_new(&bus);
1494 r = bus_set_address_system_machine(bus, machine);
1498 bus->bus_client = true;
1499 bus->trusted = false;
1500 bus->is_system = true;
1501 bus->is_local = false;
1503 r = sd_bus_start(bus);
1515 _public_ void sd_bus_close(sd_bus *bus) {
1519 if (bus->state == BUS_CLOSED)
1521 if (bus_pid_changed(bus))
1524 bus_set_state(bus, BUS_CLOSED);
1526 sd_bus_detach_event(bus);
1528 /* Drop all queued messages so that they drop references to
1529 * the bus object and the bus may be freed */
1530 bus_reset_queues(bus);
1532 bus_close_io_fds(bus);
1533 bus_close_inotify_fd(bus);
1536 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1544 return sd_bus_unref(bus);
1547 void bus_enter_closing(sd_bus *bus) {
1550 if (!IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING, BUS_HELLO, BUS_RUNNING))
1553 bus_set_state(bus, BUS_CLOSING);
1556 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1561 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1566 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1572 i = REFCNT_DEC(bus->n_ref);
1580 _public_ int sd_bus_is_open(sd_bus *bus) {
1582 assert_return(bus, -EINVAL);
1583 assert_return(bus = bus_resolve(bus), -ENOPKG);
1584 assert_return(!bus_pid_changed(bus), -ECHILD);
1586 return BUS_IS_OPEN(bus->state);
1589 _public_ int sd_bus_is_ready(sd_bus *bus) {
1590 assert_return(bus, -EINVAL);
1591 assert_return(bus = bus_resolve(bus), -ENOPKG);
1592 assert_return(!bus_pid_changed(bus), -ECHILD);
1594 return bus->state == BUS_RUNNING;
1597 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1600 assert_return(bus, -EINVAL);
1601 assert_return(bus = bus_resolve(bus), -ENOPKG);
1602 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1603 assert_return(!bus_pid_changed(bus), -ECHILD);
1605 if (bus->is_monitor)
1608 if (type == SD_BUS_TYPE_UNIX_FD) {
1609 if (!bus->accept_fd)
1612 r = bus_ensure_running(bus);
1616 return bus->can_fds;
1619 return bus_type_is_valid(type);
1622 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1625 assert_return(bus, -EINVAL);
1626 assert_return(bus = bus_resolve(bus), -ENOPKG);
1627 assert_return(id, -EINVAL);
1628 assert_return(!bus_pid_changed(bus), -ECHILD);
1630 r = bus_ensure_running(bus);
1634 *id = bus->server_id;
1638 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1645 /* If we copy the same message to multiple
1646 * destinations, avoid using the same cookie
1648 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1653 timeout = BUS_DEFAULT_TIMEOUT;
1655 if (!m->sender && b->patch_sender) {
1656 r = sd_bus_message_set_sender(m, b->patch_sender);
1661 return sd_bus_message_seal(m, ++b->cookie, timeout);
1664 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1665 bool remarshal = false;
1669 /* wrong packet version */
1670 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1673 /* wrong packet endianness */
1674 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1677 return remarshal ? bus_message_remarshal(b, m) : 0;
1680 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1684 /* Fake some timestamps, if they were requested, and not
1685 * already initialized */
1686 if (b->attach_timestamp) {
1687 if (m->realtime <= 0)
1688 m->realtime = now(CLOCK_REALTIME);
1690 if (m->monotonic <= 0)
1691 m->monotonic = now(CLOCK_MONOTONIC);
1694 /* The bus specification says the serial number cannot be 0,
1695 * hence let's fill something in for synthetic messages. Since
1696 * synthetic messages might have a fake sender and we don't
1697 * want to interfere with the real sender's serial numbers we
1698 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1699 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1700 * even though kdbus can do 64bit. */
1701 return sd_bus_message_seal(m, 0xFFFFFFFFULL, 0);
1704 static int bus_write_message(sd_bus *bus, sd_bus_message *m, size_t *idx) {
1710 r = bus_socket_write_message(bus, m, idx);
1714 if (*idx >= BUS_MESSAGE_SIZE(m))
1715 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",
1716 bus_message_type_to_string(m->header->type),
1717 strna(sd_bus_message_get_sender(m)),
1718 strna(sd_bus_message_get_destination(m)),
1719 strna(sd_bus_message_get_path(m)),
1720 strna(sd_bus_message_get_interface(m)),
1721 strna(sd_bus_message_get_member(m)),
1722 BUS_MESSAGE_COOKIE(m),
1724 strna(m->root_container.signature),
1725 strna(m->error.name),
1726 strna(m->error.message));
1731 static int dispatch_wqueue(sd_bus *bus) {
1735 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1737 while (bus->wqueue_size > 0) {
1739 r = bus_write_message(bus, bus->wqueue[0], &bus->windex);
1743 /* Didn't do anything this time */
1745 else if (bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1746 /* Fully written. Let's drop the entry from
1749 * This isn't particularly optimized, but
1750 * well, this is supposed to be our worst-case
1751 * buffer only, and the socket buffer is
1752 * supposed to be our primary buffer, and if
1753 * it got full, then all bets are off
1757 sd_bus_message_unref(bus->wqueue[0]);
1758 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1768 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1771 return bus_socket_read_message(bus);
1774 int bus_rqueue_make_room(sd_bus *bus) {
1777 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1780 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1786 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1791 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1793 /* Note that the priority logic is only available on kdbus,
1794 * where the rqueue is unused. We check the rqueue here
1795 * anyway, because it's simple... */
1798 if (bus->rqueue_size > 0) {
1799 /* Dispatch a queued message */
1801 *m = bus->rqueue[0];
1803 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1807 /* Try to read a new message */
1808 r = bus_read_message(bus, hint_priority, priority);
1818 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie) {
1819 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1822 assert_return(m, -EINVAL);
1827 assert_return(!bus_pid_changed(bus), -ECHILD);
1829 if (!BUS_IS_OPEN(bus->state))
1833 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1840 /* If the cookie number isn't kept, then we know that no reply
1842 if (!cookie && !m->sealed)
1843 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1845 r = bus_seal_message(bus, m, 0);
1849 /* Remarshall if we have to. This will possibly unref the
1850 * message and place a replacement in m */
1851 r = bus_remarshal_message(bus, &m);
1855 /* If this is a reply and no reply was requested, then let's
1856 * suppress this, if we can */
1860 if (IN_SET(bus->state, BUS_RUNNING, BUS_HELLO) && bus->wqueue_size <= 0) {
1863 r = bus_write_message(bus, m, &idx);
1865 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
1866 bus_enter_closing(bus);
1873 if (idx < BUS_MESSAGE_SIZE(m)) {
1874 /* Wasn't fully written. So let's remember how
1875 * much was written. Note that the first entry
1876 * of the wqueue array is always allocated so
1877 * that we always can remember how much was
1879 bus->wqueue[0] = sd_bus_message_ref(m);
1880 bus->wqueue_size = 1;
1885 /* Just append it to the queue. */
1887 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1890 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1893 bus->wqueue[bus->wqueue_size++] = sd_bus_message_ref(m);
1898 *cookie = BUS_MESSAGE_COOKIE(m);
1903 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1906 assert_return(m, -EINVAL);
1911 assert_return(!bus_pid_changed(bus), -ECHILD);
1913 if (!BUS_IS_OPEN(bus->state))
1916 if (!streq_ptr(m->destination, destination)) {
1921 r = sd_bus_message_set_destination(m, destination);
1926 return sd_bus_send(bus, m, cookie);
1929 static usec_t calc_elapse(sd_bus *bus, uint64_t usec) {
1932 if (usec == (uint64_t) -1)
1935 /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
1936 * with any connection setup states. Hence, if a method callback is started earlier than that we just store the
1937 * relative timestamp, and afterwards the absolute one. */
1939 if (IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING))
1942 return now(CLOCK_MONOTONIC) + usec;
1945 static int timeout_compare(const void *a, const void *b) {
1946 const struct reply_callback *x = a, *y = b;
1948 if (x->timeout_usec != 0 && y->timeout_usec == 0)
1951 if (x->timeout_usec == 0 && y->timeout_usec != 0)
1954 if (x->timeout_usec < y->timeout_usec)
1957 if (x->timeout_usec > y->timeout_usec)
1963 _public_ int sd_bus_call_async(
1967 sd_bus_message_handler_t callback,
1971 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1972 _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *s = NULL;
1975 assert_return(m, -EINVAL);
1976 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1977 assert_return(!m->sealed || (!!callback == !(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)), -EINVAL);
1982 assert_return(!bus_pid_changed(bus), -ECHILD);
1984 if (!BUS_IS_OPEN(bus->state))
1987 /* If no callback is specified and there's no interest in a slot, then there's no reason to ask for a reply */
1988 if (!callback && !slot && !m->sealed)
1989 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1991 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
1995 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1999 r = bus_seal_message(bus, m, usec);
2003 r = bus_remarshal_message(bus, &m);
2007 if (slot || callback) {
2008 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
2012 s->reply_callback.callback = callback;
2014 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
2015 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
2017 s->reply_callback.cookie = 0;
2021 s->reply_callback.timeout_usec = calc_elapse(bus, m->timeout);
2022 if (s->reply_callback.timeout_usec != 0) {
2023 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
2025 s->reply_callback.timeout_usec = 0;
2031 r = sd_bus_send(bus, m, s ? &s->reply_callback.cookie : NULL);
2042 int bus_ensure_running(sd_bus *bus) {
2047 if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
2049 if (bus->state == BUS_RUNNING)
2053 r = sd_bus_process(bus, NULL);
2056 if (bus->state == BUS_RUNNING)
2061 r = sd_bus_wait(bus, (uint64_t) -1);
2067 _public_ int sd_bus_call(
2071 sd_bus_error *error,
2072 sd_bus_message **reply) {
2074 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
2080 bus_assert_return(m, -EINVAL, error);
2081 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
2082 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
2083 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
2088 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
2090 if (!BUS_IS_OPEN(bus->state)) {
2095 r = bus_ensure_running(bus);
2099 i = bus->rqueue_size;
2101 r = bus_seal_message(bus, m, usec);
2105 r = bus_remarshal_message(bus, &m);
2109 r = sd_bus_send(bus, m, &cookie);
2113 timeout = calc_elapse(bus, m->timeout);
2118 while (i < bus->rqueue_size) {
2119 sd_bus_message *incoming = NULL;
2121 incoming = bus->rqueue[i];
2123 if (incoming->reply_cookie == cookie) {
2124 /* Found a match! */
2126 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2128 log_debug_bus_message(incoming);
2130 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2132 if (incoming->n_fds <= 0 || bus->accept_fd) {
2136 sd_bus_message_unref(incoming);
2141 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2142 sd_bus_message_unref(incoming);
2145 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
2146 r = sd_bus_error_copy(error, &incoming->error);
2147 sd_bus_message_unref(incoming);
2154 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2157 streq(bus->unique_name, incoming->sender)) {
2159 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2162 /* Our own message? Somebody is trying
2163 * to send its own client a message,
2164 * let's not dead-lock, let's fail
2167 sd_bus_message_unref(incoming);
2172 /* Try to read more, right-away */
2176 r = bus_read_message(bus, false, 0);
2178 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2179 bus_enter_closing(bus);
2191 n = now(CLOCK_MONOTONIC);
2199 left = (uint64_t) -1;
2201 r = bus_poll(bus, true, left);
2209 r = dispatch_wqueue(bus);
2211 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2212 bus_enter_closing(bus);
2221 return sd_bus_error_set_errno(error, r);
2224 _public_ int sd_bus_get_fd(sd_bus *bus) {
2226 assert_return(bus, -EINVAL);
2227 assert_return(bus = bus_resolve(bus), -ENOPKG);
2228 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2229 assert_return(!bus_pid_changed(bus), -ECHILD);
2231 if (bus->state == BUS_CLOSED)
2234 if (bus->inotify_fd >= 0)
2235 return bus->inotify_fd;
2237 if (bus->input_fd >= 0)
2238 return bus->input_fd;
2243 _public_ int sd_bus_get_events(sd_bus *bus) {
2246 assert_return(bus, -EINVAL);
2247 assert_return(bus = bus_resolve(bus), -ENOPKG);
2248 assert_return(!bus_pid_changed(bus), -ECHILD);
2250 switch (bus->state) {
2256 case BUS_WATCH_BIND:
2264 case BUS_AUTHENTICATING:
2265 if (bus_socket_auth_needs_write(bus))
2273 if (bus->rqueue_size <= 0)
2275 if (bus->wqueue_size > 0)
2283 assert_not_reached("Unknown state");
2289 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2290 struct reply_callback *c;
2292 assert_return(bus, -EINVAL);
2293 assert_return(bus = bus_resolve(bus), -ENOPKG);
2294 assert_return(timeout_usec, -EINVAL);
2295 assert_return(!bus_pid_changed(bus), -ECHILD);
2297 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2300 if (bus->track_queue) {
2305 switch (bus->state) {
2307 case BUS_AUTHENTICATING:
2308 *timeout_usec = bus->auth_timeout;
2313 if (bus->rqueue_size > 0) {
2318 c = prioq_peek(bus->reply_callbacks_prioq);
2320 *timeout_usec = (uint64_t) -1;
2324 if (c->timeout_usec == 0) {
2325 *timeout_usec = (uint64_t) -1;
2329 *timeout_usec = c->timeout_usec;
2336 case BUS_WATCH_BIND:
2338 *timeout_usec = (uint64_t) -1;
2342 assert_not_reached("Unknown or unexpected stat");
2346 static int process_timeout(sd_bus *bus) {
2347 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2348 _cleanup_(sd_bus_message_unrefp) sd_bus_message* m = NULL;
2349 struct reply_callback *c;
2356 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2358 c = prioq_peek(bus->reply_callbacks_prioq);
2362 n = now(CLOCK_MONOTONIC);
2363 if (c->timeout_usec > n)
2366 r = bus_message_new_synthetic_error(
2369 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2374 r = bus_seal_synthetic_message(bus, m);
2378 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2379 c->timeout_usec = 0;
2381 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2384 slot = container_of(c, sd_bus_slot, reply_callback);
2386 bus->iteration_counter++;
2388 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2390 bus->current_message = m;
2391 bus->current_slot = sd_bus_slot_ref(slot);
2392 bus->current_handler = c->callback;
2393 bus->current_userdata = slot->userdata;
2394 r = c->callback(m, slot->userdata, &error_buffer);
2395 bus->current_userdata = NULL;
2396 bus->current_handler = NULL;
2397 bus->current_slot = NULL;
2398 bus->current_message = NULL;
2400 if (slot->floating) {
2401 bus_slot_disconnect(slot);
2402 sd_bus_slot_unref(slot);
2405 sd_bus_slot_unref(slot);
2407 /* When this is the hello message and it timed out, then make sure to propagate the error up, don't just log
2408 * and ignore the callback handler's return value. */
2412 return bus_maybe_reply_error(m, r, &error_buffer);
2415 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2419 if (bus->state != BUS_HELLO)
2422 /* Let's make sure the first message on the bus is the HELLO
2423 * reply. But note that we don't actually parse the message
2424 * here (we leave that to the usual handling), we just verify
2425 * we don't let any earlier msg through. */
2427 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2430 if (m->reply_cookie != 1)
2436 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2437 _cleanup_(sd_bus_message_unrefp) sd_bus_message *synthetic_reply = NULL;
2438 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2439 struct reply_callback *c;
2447 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2450 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2453 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2459 slot = container_of(c, sd_bus_slot, reply_callback);
2461 if (m->n_fds > 0 && !bus->accept_fd) {
2463 /* If the reply contained a file descriptor which we
2464 * didn't want we pass an error instead. */
2466 r = bus_message_new_synthetic_error(
2469 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2474 /* Copy over original timestamp */
2475 synthetic_reply->realtime = m->realtime;
2476 synthetic_reply->monotonic = m->monotonic;
2477 synthetic_reply->seqnum = m->seqnum;
2479 r = bus_seal_synthetic_message(bus, synthetic_reply);
2483 m = synthetic_reply;
2485 r = sd_bus_message_rewind(m, true);
2490 if (c->timeout_usec != 0) {
2491 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2492 c->timeout_usec = 0;
2495 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2497 bus->current_slot = sd_bus_slot_ref(slot);
2498 bus->current_handler = c->callback;
2499 bus->current_userdata = slot->userdata;
2500 r = c->callback(m, slot->userdata, &error_buffer);
2501 bus->current_userdata = NULL;
2502 bus->current_handler = NULL;
2503 bus->current_slot = NULL;
2505 if (slot->floating) {
2506 bus_slot_disconnect(slot);
2507 sd_bus_slot_unref(slot);
2510 sd_bus_slot_unref(slot);
2512 /* When this is the hello message and it failed, then make sure to propagate the error up, don't just log and
2513 * ignore the callback handler's return value. */
2517 return bus_maybe_reply_error(m, r, &error_buffer);
2520 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2521 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2522 struct filter_callback *l;
2529 bus->filter_callbacks_modified = false;
2531 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2534 if (bus->filter_callbacks_modified)
2537 /* Don't run this more than once per iteration */
2538 if (l->last_iteration == bus->iteration_counter)
2541 l->last_iteration = bus->iteration_counter;
2543 r = sd_bus_message_rewind(m, true);
2547 slot = container_of(l, sd_bus_slot, filter_callback);
2549 bus->current_slot = sd_bus_slot_ref(slot);
2550 bus->current_handler = l->callback;
2551 bus->current_userdata = slot->userdata;
2552 r = l->callback(m, slot->userdata, &error_buffer);
2553 bus->current_userdata = NULL;
2554 bus->current_handler = NULL;
2555 bus->current_slot = sd_bus_slot_unref(slot);
2557 r = bus_maybe_reply_error(m, r, &error_buffer);
2563 } while (bus->filter_callbacks_modified);
2568 static int process_match(sd_bus *bus, sd_bus_message *m) {
2575 bus->match_callbacks_modified = false;
2577 r = bus_match_run(bus, &bus->match_callbacks, m);
2581 } while (bus->match_callbacks_modified);
2586 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2587 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
2593 if (bus->is_monitor)
2596 if (bus->manual_peer_interface)
2599 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2602 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2605 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2608 if (streq_ptr(m->member, "Ping"))
2609 r = sd_bus_message_new_method_return(m, &reply);
2610 else if (streq_ptr(m->member, "GetMachineId")) {
2614 r = sd_id128_get_machine(&id);
2618 r = sd_bus_message_new_method_return(m, &reply);
2622 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2624 r = sd_bus_message_new_method_errorf(
2626 SD_BUS_ERROR_UNKNOWN_METHOD,
2627 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2633 r = sd_bus_send(bus, reply, NULL);
2640 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2644 /* If we got a message with a file descriptor which we didn't
2645 * want to accept, then let's drop it. How can this even
2646 * happen? For example, when the kernel queues a message into
2647 * an activatable names's queue which allows fds, and then is
2648 * delivered to us later even though we ourselves did not
2651 if (bus->is_monitor)
2660 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2661 return 1; /* just eat it up */
2663 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2666 static int process_message(sd_bus *bus, sd_bus_message *m) {
2672 bus->current_message = m;
2673 bus->iteration_counter++;
2675 log_debug_bus_message(m);
2677 r = process_hello(bus, m);
2681 r = process_reply(bus, m);
2685 r = process_fd_check(bus, m);
2689 r = process_filter(bus, m);
2693 r = process_match(bus, m);
2697 r = process_builtin(bus, m);
2701 r = bus_process_object(bus, m);
2704 bus->current_message = NULL;
2708 static int dispatch_track(sd_bus *bus) {
2711 if (!bus->track_queue)
2714 bus_track_dispatch(bus->track_queue);
2718 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2719 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2723 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2725 r = process_timeout(bus);
2729 r = dispatch_wqueue(bus);
2733 r = dispatch_track(bus);
2737 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2743 r = process_message(bus, m);
2748 r = sd_bus_message_rewind(m, true);
2757 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2759 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2760 strna(sd_bus_message_get_sender(m)),
2761 strna(sd_bus_message_get_path(m)),
2762 strna(sd_bus_message_get_interface(m)),
2763 strna(sd_bus_message_get_member(m)));
2765 r = sd_bus_reply_method_errorf(
2767 SD_BUS_ERROR_UNKNOWN_OBJECT,
2768 "Unknown object '%s'.", m->path);
2782 static int bus_exit_now(sd_bus *bus) {
2785 /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
2786 * sd_event_exit(), otherwise invokes libc exit(). */
2788 if (bus->exited) /* did we already exit? */
2790 if (!bus->exit_triggered) /* was the exit condition triggered? */
2792 if (!bus->exit_on_disconnect) /* Shall we actually exit on disconnection? */
2795 bus->exited = true; /* never exit more than once */
2797 log_debug("Bus connection disconnected, exiting.");
2800 return sd_event_exit(bus->event, EXIT_FAILURE);
2804 assert_not_reached("exit() didn't exit?");
2807 static int process_closing_reply_callback(sd_bus *bus, struct reply_callback *c) {
2808 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2809 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2816 r = bus_message_new_synthetic_error(
2819 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2824 r = bus_seal_synthetic_message(bus, m);
2828 if (c->timeout_usec != 0) {
2829 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2830 c->timeout_usec = 0;
2833 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2836 slot = container_of(c, sd_bus_slot, reply_callback);
2838 bus->iteration_counter++;
2840 bus->current_message = m;
2841 bus->current_slot = sd_bus_slot_ref(slot);
2842 bus->current_handler = c->callback;
2843 bus->current_userdata = slot->userdata;
2844 r = c->callback(m, slot->userdata, &error_buffer);
2845 bus->current_userdata = NULL;
2846 bus->current_handler = NULL;
2847 bus->current_slot = NULL;
2848 bus->current_message = NULL;
2850 if (slot->floating) {
2851 bus_slot_disconnect(slot);
2852 sd_bus_slot_unref(slot);
2855 sd_bus_slot_unref(slot);
2857 return bus_maybe_reply_error(m, r, &error_buffer);
2860 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2861 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2862 struct reply_callback *c;
2866 assert(bus->state == BUS_CLOSING);
2868 /* First, fail all outstanding method calls */
2869 c = ordered_hashmap_first(bus->reply_callbacks);
2871 return process_closing_reply_callback(bus, c);
2873 /* Then, fake-drop all remaining bus tracking references */
2875 bus_track_close(bus->tracks);
2879 /* Then, synthesize a Disconnected message */
2880 r = sd_bus_message_new_signal(
2883 "/org/freedesktop/DBus/Local",
2884 "org.freedesktop.DBus.Local",
2889 bus_message_set_sender_local(bus, m);
2891 r = bus_seal_synthetic_message(bus, m);
2897 bus->current_message = m;
2898 bus->iteration_counter++;
2900 r = process_filter(bus, m);
2904 r = process_match(bus, m);
2908 /* Nothing else to do, exit now, if the condition holds */
2909 bus->exit_triggered = true;
2910 (void) bus_exit_now(bus);
2920 bus->current_message = NULL;
2925 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2926 BUS_DONT_DESTROY(bus);
2929 /* Returns 0 when we didn't do anything. This should cause the
2930 * caller to invoke sd_bus_wait() before returning the next
2931 * time. Returns > 0 when we did something, which possibly
2932 * means *ret is filled in with an unprocessed message. */
2934 assert_return(bus, -EINVAL);
2935 assert_return(bus = bus_resolve(bus), -ENOPKG);
2936 assert_return(!bus_pid_changed(bus), -ECHILD);
2938 /* We don't allow recursively invoking sd_bus_process(). */
2939 assert_return(!bus->current_message, -EBUSY);
2940 assert(!bus->current_slot);
2942 switch (bus->state) {
2950 case BUS_WATCH_BIND:
2951 r = bus_socket_process_watch_bind(bus);
2955 r = bus_socket_process_opening(bus);
2958 case BUS_AUTHENTICATING:
2959 r = bus_socket_process_authenticating(bus);
2964 r = process_running(bus, hint_priority, priority, ret);
2968 /* This branch initializes *ret, hence we don't use the generic error checking below */
2972 return process_closing(bus, ret);
2975 assert_not_reached("Unknown state");
2978 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2979 bus_enter_closing(bus);
2990 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2991 return bus_process_internal(bus, false, 0, ret);
2994 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2995 return bus_process_internal(bus, true, priority, ret);
2998 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2999 struct pollfd p[2] = {};
3002 usec_t m = USEC_INFINITY;
3006 if (bus->state == BUS_CLOSING)
3009 if (!BUS_IS_OPEN(bus->state))
3012 if (bus->state == BUS_WATCH_BIND) {
3013 assert(bus->inotify_fd >= 0);
3015 p[0].events = POLLIN;
3016 p[0].fd = bus->inotify_fd;
3021 e = sd_bus_get_events(bus);
3026 /* The caller really needs some more data, he doesn't
3027 * care about what's already read, or any timeouts
3028 * except its own. */
3032 /* The caller wants to process if there's something to
3033 * process, but doesn't care otherwise */
3035 r = sd_bus_get_timeout(bus, &until);
3039 m = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
3042 p[0].fd = bus->input_fd;
3043 if (bus->output_fd == bus->input_fd) {
3047 p[0].events = e & POLLIN;
3048 p[1].fd = bus->output_fd;
3049 p[1].events = e & POLLOUT;
3054 if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
3057 r = ppoll(p, n, m == USEC_INFINITY ? NULL : timespec_store(&ts, m), NULL);
3061 return r > 0 ? 1 : 0;
3064 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
3066 assert_return(bus, -EINVAL);
3067 assert_return(bus = bus_resolve(bus), -ENOPKG);
3068 assert_return(!bus_pid_changed(bus), -ECHILD);
3070 if (bus->state == BUS_CLOSING)
3073 if (!BUS_IS_OPEN(bus->state))
3076 if (bus->rqueue_size > 0)
3079 return bus_poll(bus, false, timeout_usec);
3082 _public_ int sd_bus_flush(sd_bus *bus) {
3085 assert_return(bus, -EINVAL);
3086 assert_return(bus = bus_resolve(bus), -ENOPKG);
3087 assert_return(!bus_pid_changed(bus), -ECHILD);
3089 if (bus->state == BUS_CLOSING)
3092 if (!BUS_IS_OPEN(bus->state))
3095 /* We never were connected? Don't hang in inotify for good, as there's no timeout set for it */
3096 if (bus->state == BUS_WATCH_BIND)
3099 r = bus_ensure_running(bus);
3103 if (bus->wqueue_size <= 0)
3107 r = dispatch_wqueue(bus);
3109 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
3110 bus_enter_closing(bus);
3117 if (bus->wqueue_size <= 0)
3120 r = bus_poll(bus, false, (uint64_t) -1);
3126 _public_ int sd_bus_add_filter(
3129 sd_bus_message_handler_t callback,
3134 assert_return(bus, -EINVAL);
3135 assert_return(bus = bus_resolve(bus), -ENOPKG);
3136 assert_return(callback, -EINVAL);
3137 assert_return(!bus_pid_changed(bus), -ECHILD);
3139 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
3143 s->filter_callback.callback = callback;
3145 bus->filter_callbacks_modified = true;
3146 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
3154 static int add_match_callback(
3157 sd_bus_error *ret_error) {
3159 sd_bus_slot *match_slot = userdata;
3160 bool failed = false;
3166 sd_bus_slot_ref(match_slot);
3168 if (sd_bus_message_is_method_error(m, NULL)) {
3169 log_debug_errno(sd_bus_message_get_errno(m),
3170 "Unable to add match %s, failing connection: %s",
3171 match_slot->match_callback.match_string,
3172 sd_bus_message_get_error(m)->message);
3176 log_debug("Match %s successfully installed.", match_slot->match_callback.match_string);
3178 if (match_slot->match_callback.install_callback) {
3181 bus = sd_bus_message_get_bus(m);
3183 /* This function has been called as slot handler, and we want to call another slot handler. Let's
3184 * update the slot callback metadata temporarily with our own data, and then revert back to the old
3187 assert(bus->current_slot == match_slot->match_callback.install_slot);
3188 assert(bus->current_handler == add_match_callback);
3189 assert(bus->current_userdata == userdata);
3191 bus->current_slot = match_slot;
3192 bus->current_handler = match_slot->match_callback.install_callback;
3193 bus->current_userdata = match_slot->userdata;
3195 r = match_slot->match_callback.install_callback(m, match_slot->userdata, ret_error);
3197 bus->current_slot = match_slot->match_callback.install_slot;
3198 bus->current_handler = add_match_callback;
3199 bus->current_userdata = userdata;
3201 match_slot->match_callback.install_slot = sd_bus_slot_unref(match_slot->match_callback.install_slot);
3203 if (failed) /* Generic failure handling: destroy the connection */
3204 bus_enter_closing(sd_bus_message_get_bus(m));
3209 if (failed && match_slot->floating) {
3210 bus_slot_disconnect(match_slot);
3211 sd_bus_slot_unref(match_slot);
3214 sd_bus_slot_unref(match_slot);
3219 static int bus_add_match_full(
3224 sd_bus_message_handler_t callback,
3225 sd_bus_message_handler_t install_callback,
3228 struct bus_match_component *components = NULL;
3229 unsigned n_components = 0;
3230 sd_bus_slot *s = NULL;
3233 assert_return(bus, -EINVAL);
3234 assert_return(bus = bus_resolve(bus), -ENOPKG);
3235 assert_return(match, -EINVAL);
3236 assert_return(!bus_pid_changed(bus), -ECHILD);
3238 r = bus_match_parse(match, &components, &n_components);
3242 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
3248 s->match_callback.callback = callback;
3249 s->match_callback.install_callback = install_callback;
3251 if (bus->bus_client) {
3252 enum bus_match_scope scope;
3254 scope = bus_match_get_scope(components, n_components);
3256 /* Do not install server-side matches for matches against the local service, interface or bus path. */
3257 if (scope != BUS_MATCH_LOCAL) {
3259 /* We store the original match string, so that we can use it to remove the match again. */
3261 s->match_callback.match_string = strdup(match);
3262 if (!s->match_callback.match_string) {
3268 r = bus_add_match_internal_async(bus,
3269 &s->match_callback.install_slot,
3270 s->match_callback.match_string,
3274 r = bus_add_match_internal(bus, s->match_callback.match_string);
3278 s->match_added = true;
3282 bus->match_callbacks_modified = true;
3283 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3292 bus_match_parse_free(components, n_components);
3293 sd_bus_slot_unref(s);
3298 #if 0 /// UNNEEDED by elogind
3300 _public_ int sd_bus_add_match(
3304 sd_bus_message_handler_t callback,
3307 return bus_add_match_full(bus, slot, false, match, callback, NULL, userdata);
3310 _public_ int sd_bus_add_match_async(
3314 sd_bus_message_handler_t callback,
3315 sd_bus_message_handler_t install_callback,
3318 return bus_add_match_full(bus, slot, true, match, callback, install_callback, userdata);
3321 bool bus_pid_changed(sd_bus *bus) {
3324 /* We don't support people creating a bus connection and
3325 * keeping it around over a fork(). Let's complain. */
3327 return bus->original_pid != getpid_cached();
3330 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3331 sd_bus *bus = userdata;
3336 /* Note that this is called both on input_fd, output_fd as well as inotify_fd events */
3338 r = sd_bus_process(bus, NULL);
3340 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3341 bus_enter_closing(bus);
3347 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3348 sd_bus *bus = userdata;
3353 r = sd_bus_process(bus, NULL);
3355 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3356 bus_enter_closing(bus);
3362 static int prepare_callback(sd_event_source *s, void *userdata) {
3363 sd_bus *bus = userdata;
3370 e = sd_bus_get_events(bus);
3376 if (bus->output_fd != bus->input_fd) {
3378 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3382 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3384 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3388 r = sd_bus_get_timeout(bus, &until);
3394 j = sd_event_source_set_time(bus->time_event_source, until);
3401 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3408 log_debug_errno(r, "Preparing of bus events failed, closing down: %m");
3409 bus_enter_closing(bus);
3414 static int quit_callback(sd_event_source *event, void *userdata) {
3415 sd_bus *bus = userdata;
3425 int bus_attach_io_events(sd_bus *bus) {
3430 if (bus->input_fd < 0)
3436 if (!bus->input_io_event_source) {
3437 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3441 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3445 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3449 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3451 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3456 if (bus->output_fd != bus->input_fd) {
3457 assert(bus->output_fd >= 0);
3459 if (!bus->output_io_event_source) {
3460 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3464 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3468 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3470 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3479 static void bus_detach_io_events(sd_bus *bus) {
3482 if (bus->input_io_event_source) {
3483 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3484 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3487 if (bus->output_io_event_source) {
3488 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3489 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3493 int bus_attach_inotify_event(sd_bus *bus) {
3498 if (bus->inotify_fd < 0)
3504 if (!bus->inotify_event_source) {
3505 r = sd_event_add_io(bus->event, &bus->inotify_event_source, bus->inotify_fd, EPOLLIN, io_callback, bus);
3509 r = sd_event_source_set_priority(bus->inotify_event_source, bus->event_priority);
3513 r = sd_event_source_set_description(bus->inotify_event_source, "bus-inotify");
3515 r = sd_event_source_set_io_fd(bus->inotify_event_source, bus->inotify_fd);
3522 static void bus_detach_inotify_event(sd_bus *bus) {
3525 if (bus->inotify_event_source) {
3526 sd_event_source_set_enabled(bus->inotify_event_source, SD_EVENT_OFF);
3527 bus->inotify_event_source = sd_event_source_unref(bus->inotify_event_source);
3531 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3534 assert_return(bus, -EINVAL);
3535 assert_return(bus = bus_resolve(bus), -ENOPKG);
3536 assert_return(!bus->event, -EBUSY);
3538 assert(!bus->input_io_event_source);
3539 assert(!bus->output_io_event_source);
3540 assert(!bus->time_event_source);
3543 bus->event = sd_event_ref(event);
3545 r = sd_event_default(&bus->event);
3550 bus->event_priority = priority;
3552 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3556 r = sd_event_source_set_priority(bus->time_event_source, priority);
3560 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3564 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3568 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3572 r = bus_attach_io_events(bus);
3576 r = bus_attach_inotify_event(bus);
3583 sd_bus_detach_event(bus);
3587 _public_ int sd_bus_detach_event(sd_bus *bus) {
3588 assert_return(bus, -EINVAL);
3589 assert_return(bus = bus_resolve(bus), -ENOPKG);
3594 bus_detach_io_events(bus);
3595 bus_detach_inotify_event(bus);
3597 if (bus->time_event_source) {
3598 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3599 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3602 if (bus->quit_event_source) {
3603 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3604 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3607 bus->event = sd_event_unref(bus->event);
3611 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3612 assert_return(bus, NULL);
3617 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3618 assert_return(bus, NULL);
3620 return bus->current_message;
3623 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3624 assert_return(bus, NULL);
3626 return bus->current_slot;
3629 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3630 assert_return(bus, NULL);
3632 return bus->current_handler;
3635 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3636 assert_return(bus, NULL);
3638 return bus->current_userdata;
3641 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3646 assert(default_bus);
3649 return !!*default_bus;
3652 *ret = sd_bus_ref(*default_bus);
3660 b->default_bus_ptr = default_bus;
3668 _public_ int sd_bus_default_system(sd_bus **ret) {
3669 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3673 _public_ int sd_bus_default_user(sd_bus **ret) {
3674 #if 0 /// elogind does not support user buses
3675 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3677 return sd_bus_default_system(ret);
3681 _public_ int sd_bus_default(sd_bus **ret) {
3682 int (*bus_open)(sd_bus **) = NULL;
3685 #if 0 /// elogind does not support systemd units
3688 #if 0 /// elogind does not support systemd user instances
3690 busp = bus_choose_default(&bus_open);
3691 return bus_default(bus_open, busp, ret);
3694 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3695 assert_return(b, -EINVAL);
3696 assert_return(tid, -EINVAL);
3697 assert_return(!bus_pid_changed(b), -ECHILD);
3705 return sd_event_get_tid(b->event, tid);
3710 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3711 _cleanup_free_ char *e = NULL;
3714 assert_return(object_path_is_valid(prefix), -EINVAL);
3715 assert_return(external_id, -EINVAL);
3716 assert_return(ret_path, -EINVAL);
3718 e = bus_label_escape(external_id);
3722 ret = strjoin(prefix, "/", e);
3730 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3734 assert_return(object_path_is_valid(path), -EINVAL);
3735 assert_return(object_path_is_valid(prefix), -EINVAL);
3736 assert_return(external_id, -EINVAL);
3738 e = object_path_startswith(path, prefix);
3740 *external_id = NULL;
3744 ret = bus_label_unescape(e);
3752 _public_ int sd_bus_path_encode_many(char **out, const char *path_template, ...) {
3753 _cleanup_strv_free_ char **labels = NULL;
3754 char *path, *path_pos, **label_pos;
3755 const char *sep, *template_pos;
3760 assert_return(out, -EINVAL);
3761 assert_return(path_template, -EINVAL);
3763 path_length = strlen(path_template);
3765 va_start(list, path_template);
3766 for (sep = strchr(path_template, '%'); sep; sep = strchr(sep + 1, '%')) {
3770 arg = va_arg(list, const char *);
3776 label = bus_label_escape(arg);
3782 r = strv_consume(&labels, label);
3788 /* add label length, but account for the format character */
3789 path_length += strlen(label) - 1;
3793 path = malloc(path_length + 1);
3800 for (template_pos = path_template; *template_pos; ) {
3801 sep = strchrnul(template_pos, '%');
3802 path_pos = mempcpy(path_pos, template_pos, sep - template_pos);
3806 path_pos = stpcpy(path_pos, *label_pos++);
3807 template_pos = sep + 1;
3815 _public_ int sd_bus_path_decode_many(const char *path, const char *path_template, ...) {
3816 _cleanup_strv_free_ char **labels = NULL;
3817 const char *template_pos, *path_pos;
3823 * This decodes an object-path based on a template argument. The
3824 * template consists of a verbatim path, optionally including special
3827 * - Each occurrence of '%' in the template matches an arbitrary
3828 * substring of a label in the given path. At most one such
3829 * directive is allowed per label. For each such directive, the
3830 * caller must provide an output parameter (char **) via va_arg. If
3831 * NULL is passed, the given label is verified, but not returned.
3832 * For each matched label, the *decoded* label is stored in the
3833 * passed output argument, and the caller is responsible to free
3834 * it. Note that the output arguments are only modified if the
3835 * actualy path matched the template. Otherwise, they're left
3838 * This function returns <0 on error, 0 if the path does not match the
3839 * template, 1 if it matched.
3842 assert_return(path, -EINVAL);
3843 assert_return(path_template, -EINVAL);
3847 for (template_pos = path_template; *template_pos; ) {
3852 /* verify everything until the next '%' matches verbatim */
3853 sep = strchrnul(template_pos, '%');
3854 length = sep - template_pos;
3855 if (strncmp(path_pos, template_pos, length))
3859 template_pos += length;
3864 /* We found the next '%' character. Everything up until here
3865 * matched. We now skip ahead to the end of this label and make
3866 * sure it matches the tail of the label in the path. Then we
3867 * decode the string in-between and save it for later use. */
3869 ++template_pos; /* skip over '%' */
3871 sep = strchrnul(template_pos, '/');
3872 length = sep - template_pos; /* length of suffix to match verbatim */
3874 /* verify the suffixes match */
3875 sep = strchrnul(path_pos, '/');
3876 if (sep - path_pos < (ssize_t)length ||
3877 strncmp(sep - length, template_pos, length))
3880 template_pos += length; /* skip over matched label */
3881 length = sep - path_pos - length; /* length of sub-label to decode */
3883 /* store unescaped label for later use */
3884 label = bus_label_unescape_n(path_pos, length);
3888 r = strv_consume(&labels, label);
3892 path_pos = sep; /* skip decoded label and suffix */
3895 /* end of template must match end of path */
3899 /* copy the labels over to the caller */
3900 va_start(list, path_template);
3901 for (label_pos = labels; label_pos && *label_pos; ++label_pos) {
3904 arg = va_arg(list, char **);
3912 labels = mfree(labels);
3916 _public_ int sd_bus_try_close(sd_bus *bus) {
3917 assert_return(bus, -EINVAL);
3918 assert_return(bus = bus_resolve(bus), -ENOPKG);
3919 assert_return(!bus_pid_changed(bus), -ECHILD);
3924 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3925 assert_return(bus, -EINVAL);
3926 assert_return(bus = bus_resolve(bus), -ENOPKG);
3927 assert_return(description, -EINVAL);
3928 assert_return(bus->description, -ENXIO);
3929 assert_return(!bus_pid_changed(bus), -ECHILD);
3931 *description = bus->description;
3935 int bus_get_root_path(sd_bus *bus) {
3938 if (bus->cgroup_root)
3941 r = cg_get_root_path(&bus->cgroup_root);
3943 bus->cgroup_root = strdup("/");
3944 if (!bus->cgroup_root)
3953 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3954 assert_return(bus, -EINVAL);
3955 assert_return(bus = bus_resolve(bus), -ENOPKG);
3956 assert_return(scope, -EINVAL);
3957 assert_return(!bus_pid_changed(bus), -ECHILD);
3964 if (bus->is_system) {
3972 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3974 assert_return(bus, -EINVAL);
3975 assert_return(bus = bus_resolve(bus), -ENOPKG);
3976 assert_return(address, -EINVAL);
3977 assert_return(!bus_pid_changed(bus), -ECHILD);
3980 *address = bus->address;
3987 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
3988 assert_return(bus, -EINVAL);
3989 assert_return(bus = bus_resolve(bus), -ENOPKG);
3990 assert_return(mask, -EINVAL);
3991 assert_return(!bus_pid_changed(bus), -ECHILD);
3993 *mask = bus->creds_mask;
3997 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
3998 assert_return(bus, -EINVAL);
3999 assert_return(bus = bus_resolve(bus), -ENOPKG);
4000 assert_return(!bus_pid_changed(bus), -ECHILD);
4002 return bus->bus_client;
4005 _public_ int sd_bus_is_server(sd_bus *bus) {
4006 assert_return(bus, -EINVAL);
4007 assert_return(bus = bus_resolve(bus), -ENOPKG);
4008 assert_return(!bus_pid_changed(bus), -ECHILD);
4010 return bus->is_server;
4013 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
4014 assert_return(bus, -EINVAL);
4015 assert_return(bus = bus_resolve(bus), -ENOPKG);
4016 assert_return(!bus_pid_changed(bus), -ECHILD);
4018 return bus->anonymous_auth;
4021 _public_ int sd_bus_is_trusted(sd_bus *bus) {
4022 assert_return(bus, -EINVAL);
4023 assert_return(bus = bus_resolve(bus), -ENOPKG);
4024 assert_return(!bus_pid_changed(bus), -ECHILD);
4026 return bus->trusted;
4029 _public_ int sd_bus_is_monitor(sd_bus *bus) {
4030 assert_return(bus, -EINVAL);
4031 assert_return(bus = bus_resolve(bus), -ENOPKG);
4032 assert_return(!bus_pid_changed(bus), -ECHILD);
4034 return bus->is_monitor;
4037 static void flush_close(sd_bus *bus) {
4041 /* Flushes and closes the specified bus. We take a ref before,
4042 * to ensure the flushing does not cause the bus to be
4045 sd_bus_flush_close_unref(sd_bus_ref(bus));
4048 _public_ void sd_bus_default_flush_close(void) {
4049 flush_close(default_starter_bus);
4050 #if 0 /// elogind does not support user buses
4051 flush_close(default_user_bus);
4053 flush_close(default_system_bus);
4056 _public_ int sd_bus_set_exit_on_disconnect(sd_bus *bus, int b) {
4057 assert_return(bus, -EINVAL);
4058 assert_return(bus = bus_resolve(bus), -ENOPKG);
4060 /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
4061 * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
4062 * from the client side. */
4063 bus->exit_on_disconnect = b;
4065 /* If the exit condition was triggered already, exit immediately. */
4066 return bus_exit_now(bus);
4069 _public_ int sd_bus_get_exit_on_disconnect(sd_bus *bus) {
4070 assert_return(bus, -EINVAL);
4071 assert_return(bus = bus_resolve(bus), -ENOPKG);
4073 return bus->exit_on_disconnect;
4076 _public_ int sd_bus_set_sender(sd_bus *bus, const char *sender) {
4077 assert_return(bus, -EINVAL);
4078 assert_return(bus = bus_resolve(bus), -ENOPKG);
4079 assert_return(!bus->bus_client, -EPERM);
4080 assert_return(!sender || service_name_is_valid(sender), -EINVAL);
4082 return free_and_strdup(&bus->patch_sender, sender);
4085 _public_ int sd_bus_get_sender(sd_bus *bus, const char **ret) {
4086 assert_return(bus, -EINVAL);
4087 assert_return(bus = bus_resolve(bus), -ENOPKG);
4088 assert_return(ret, -EINVAL);
4090 if (!bus->patch_sender)
4093 *ret = bus->patch_sender;