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/>.
28 //#include <sys/wait.h>
33 #include "alloc-util.h"
34 #include "bus-container.h"
35 #include "bus-control.h"
36 #include "bus-internal.h"
37 #include "bus-kernel.h"
38 #include "bus-label.h"
39 #include "bus-message.h"
40 #include "bus-objects.h"
41 #include "bus-protocol.h"
43 #include "bus-socket.h"
44 #include "bus-track.h"
47 #include "cgroup-util.h"
50 #include "hexdecoct.h"
51 #include "hostname-util.h"
54 #include "parse-util.h"
55 //#include "process-util.h"
56 #include "string-util.h"
60 /// Additional includes needed by elogind
61 #include "process-util.h"
63 #define log_debug_bus_message(m) \
65 sd_bus_message *_mm = (m); \
66 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", \
67 bus_message_type_to_string(_mm->header->type), \
68 strna(sd_bus_message_get_sender(_mm)), \
69 strna(sd_bus_message_get_destination(_mm)), \
70 strna(sd_bus_message_get_path(_mm)), \
71 strna(sd_bus_message_get_interface(_mm)), \
72 strna(sd_bus_message_get_member(_mm)), \
73 BUS_MESSAGE_COOKIE(_mm), \
75 strna(_mm->root_container.signature), \
76 strna(_mm->error.name), \
77 strna(_mm->error.message)); \
80 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
81 static void bus_detach_io_events(sd_bus *b);
82 static void bus_detach_inotify_event(sd_bus *b);
84 static thread_local sd_bus *default_system_bus = NULL;
85 #if 0 /// UNNEEDED by elogind
86 static thread_local sd_bus *default_user_bus = NULL;
88 static thread_local sd_bus *default_starter_bus = NULL;
90 static sd_bus **bus_choose_default(int (**bus_open)(sd_bus **)) {
93 /* Let's try our best to reuse another cached connection. If
94 * the starter bus type is set, connect via our normal
95 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
96 * we can share the connection with the user/system default
99 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
101 if (streq(e, "system")) {
103 *bus_open = sd_bus_open_system;
104 return &default_system_bus;
105 } else if (STR_IN_SET(e, "user", "session")) {
107 *bus_open = sd_bus_open_user;
108 return &default_user_bus;
112 /* No type is specified, so we have not other option than to
113 * use the starter address if it is set. */
114 e = secure_getenv("DBUS_STARTER_ADDRESS");
117 *bus_open = sd_bus_open;
118 return &default_starter_bus;
121 /* Finally, if nothing is set use the cached connection for
124 if (cg_pid_get_owner_uid(0, NULL) >= 0) {
126 *bus_open = sd_bus_open_user;
127 return &default_user_bus;
130 *bus_open = sd_bus_open_system;
131 return &default_system_bus;
135 sd_bus *bus_resolve(sd_bus *bus) {
136 switch ((uintptr_t) bus) {
137 case (uintptr_t) SD_BUS_DEFAULT:
138 return *(bus_choose_default(NULL));
139 case (uintptr_t) SD_BUS_DEFAULT_USER:
140 return default_user_bus;
141 case (uintptr_t) SD_BUS_DEFAULT_SYSTEM:
142 return default_system_bus;
148 void bus_close_io_fds(sd_bus *b) {
151 bus_detach_io_events(b);
153 if (b->input_fd != b->output_fd)
154 safe_close(b->output_fd);
155 b->output_fd = b->input_fd = safe_close(b->input_fd);
158 void bus_close_inotify_fd(sd_bus *b) {
161 bus_detach_inotify_event(b);
163 b->inotify_fd = safe_close(b->inotify_fd);
164 b->inotify_watches = mfree(b->inotify_watches);
165 b->n_inotify_watches = 0;
168 static void bus_reset_queues(sd_bus *b) {
171 while (b->rqueue_size > 0)
172 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
174 b->rqueue = mfree(b->rqueue);
175 b->rqueue_allocated = 0;
177 while (b->wqueue_size > 0)
178 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
180 b->wqueue = mfree(b->wqueue);
181 b->wqueue_allocated = 0;
184 static void bus_free(sd_bus *b) {
188 assert(!b->track_queue);
191 b->state = BUS_CLOSED;
193 sd_bus_detach_event(b);
195 while ((s = b->slots)) {
196 /* At this point only floating slots can still be
197 * around, because the non-floating ones keep a
198 * reference to the bus, and we thus couldn't be
199 * destructing right now... We forcibly disconnect the
200 * slots here, so that they still can be referenced by
201 * apps, but are dead. */
204 bus_slot_disconnect(s);
205 sd_bus_slot_unref(s);
208 if (b->default_bus_ptr)
209 *b->default_bus_ptr = NULL;
212 bus_close_inotify_fd(b);
217 free(b->unique_name);
218 free(b->auth_buffer);
221 free(b->cgroup_root);
222 free(b->description);
223 free(b->patch_sender);
226 strv_free(b->exec_argv);
228 close_many(b->fds, b->n_fds);
233 ordered_hashmap_free_free(b->reply_callbacks);
234 prioq_free(b->reply_callbacks_prioq);
236 assert(b->match_callbacks.type == BUS_MATCH_ROOT);
237 bus_match_free(&b->match_callbacks);
239 hashmap_free_free(b->vtable_methods);
240 hashmap_free_free(b->vtable_properties);
242 assert(hashmap_isempty(b->nodes));
243 hashmap_free(b->nodes);
247 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
252 _public_ int sd_bus_new(sd_bus **ret) {
255 assert_return(ret, -EINVAL);
261 r->n_ref = REFCNT_INIT;
262 r->input_fd = r->output_fd = -1;
264 r->message_version = 1;
265 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
267 r->original_pid = getpid_cached();
268 r->n_groups = (size_t) -1;
270 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
272 /* We guarantee that wqueue always has space for at least one
274 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
283 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
286 assert_return(bus, -EINVAL);
287 assert_return(bus = bus_resolve(bus), -ENOPKG);
288 assert_return(bus->state == BUS_UNSET, -EPERM);
289 assert_return(address, -EINVAL);
290 assert_return(!bus_pid_changed(bus), -ECHILD);
302 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
303 assert_return(bus, -EINVAL);
304 assert_return(bus = bus_resolve(bus), -ENOPKG);
305 assert_return(bus->state == BUS_UNSET, -EPERM);
306 assert_return(input_fd >= 0, -EBADF);
307 assert_return(output_fd >= 0, -EBADF);
308 assert_return(!bus_pid_changed(bus), -ECHILD);
310 bus->input_fd = input_fd;
311 bus->output_fd = output_fd;
315 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
318 assert_return(bus, -EINVAL);
319 assert_return(bus = bus_resolve(bus), -ENOPKG);
320 assert_return(bus->state == BUS_UNSET, -EPERM);
321 assert_return(path, -EINVAL);
322 assert_return(!strv_isempty(argv), -EINVAL);
323 assert_return(!bus_pid_changed(bus), -ECHILD);
335 free(bus->exec_path);
336 strv_free(bus->exec_argv);
344 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
345 assert_return(bus, -EINVAL);
346 assert_return(bus = bus_resolve(bus), -ENOPKG);
347 assert_return(bus->state == BUS_UNSET, -EPERM);
348 assert_return(!bus->patch_sender, -EPERM);
349 assert_return(!bus_pid_changed(bus), -ECHILD);
351 bus->bus_client = !!b;
355 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
356 assert_return(bus, -EINVAL);
357 assert_return(bus = bus_resolve(bus), -ENOPKG);
358 assert_return(bus->state == BUS_UNSET, -EPERM);
359 assert_return(!bus_pid_changed(bus), -ECHILD);
365 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
366 assert_return(bus, -EINVAL);
367 assert_return(bus = bus_resolve(bus), -ENOPKG);
368 assert_return(bus->state == BUS_UNSET, -EPERM);
369 assert_return(!bus_pid_changed(bus), -ECHILD);
375 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
376 assert_return(bus, -EINVAL);
377 assert_return(bus = bus_resolve(bus), -ENOPKG);
378 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
379 assert_return(!bus_pid_changed(bus), -ECHILD);
381 /* This is not actually supported by any of our transports these days, but we do honour it for synthetic
382 * replies, and maybe one day classic D-Bus learns this too */
383 bus->attach_timestamp = b;
388 _public_ int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t mask) {
389 assert_return(bus, -EINVAL);
390 assert_return(bus = bus_resolve(bus), -ENOPKG);
391 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
392 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
393 assert_return(!bus_pid_changed(bus), -ECHILD);
395 SET_FLAG(bus->creds_mask, mask, b);
397 /* The well knowns we need unconditionally, so that matches can work */
398 bus->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
403 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
404 assert_return(bus, -EINVAL);
405 assert_return(bus = bus_resolve(bus), -ENOPKG);
406 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
407 assert_return(bus->state == BUS_UNSET, -EPERM);
408 assert_return(!bus_pid_changed(bus), -ECHILD);
410 bus->is_server = !!b;
411 bus->server_id = server_id;
415 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
416 assert_return(bus, -EINVAL);
417 assert_return(bus = bus_resolve(bus), -ENOPKG);
418 assert_return(bus->state == BUS_UNSET, -EPERM);
419 assert_return(!bus_pid_changed(bus), -ECHILD);
421 bus->anonymous_auth = !!b;
425 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
426 assert_return(bus, -EINVAL);
427 assert_return(bus = bus_resolve(bus), -ENOPKG);
428 assert_return(bus->state == BUS_UNSET, -EPERM);
429 assert_return(!bus_pid_changed(bus), -ECHILD);
435 _public_ int sd_bus_set_description(sd_bus *bus, const char *description) {
436 assert_return(bus, -EINVAL);
437 assert_return(bus = bus_resolve(bus), -ENOPKG);
438 assert_return(bus->state == BUS_UNSET, -EPERM);
439 assert_return(!bus_pid_changed(bus), -ECHILD);
441 return free_and_strdup(&bus->description, description);
444 _public_ int sd_bus_set_allow_interactive_authorization(sd_bus *bus, int b) {
445 assert_return(bus, -EINVAL);
446 assert_return(bus = bus_resolve(bus), -ENOPKG);
447 assert_return(!bus_pid_changed(bus), -ECHILD);
449 bus->allow_interactive_authorization = !!b;
453 _public_ int sd_bus_get_allow_interactive_authorization(sd_bus *bus) {
454 assert_return(bus, -EINVAL);
455 assert_return(bus = bus_resolve(bus), -ENOPKG);
456 assert_return(!bus_pid_changed(bus), -ECHILD);
458 return bus->allow_interactive_authorization;
461 _public_ int sd_bus_set_watch_bind(sd_bus *bus, int b) {
462 assert_return(bus, -EINVAL);
463 assert_return(bus = bus_resolve(bus), -ENOPKG);
464 assert_return(bus->state == BUS_UNSET, -EPERM);
465 assert_return(!bus_pid_changed(bus), -ECHILD);
471 _public_ int sd_bus_get_watch_bind(sd_bus *bus) {
472 assert_return(bus, -EINVAL);
473 assert_return(bus = bus_resolve(bus), -ENOPKG);
474 assert_return(!bus_pid_changed(bus), -ECHILD);
476 return bus->watch_bind;
479 _public_ int sd_bus_set_connected_signal(sd_bus *bus, int b) {
480 assert_return(bus, -EINVAL);
481 assert_return(bus = bus_resolve(bus), -ENOPKG);
482 assert_return(bus->state == BUS_UNSET, -EPERM);
483 assert_return(!bus_pid_changed(bus), -ECHILD);
485 bus->connected_signal = b;
489 _public_ int sd_bus_get_connected_signal(sd_bus *bus) {
490 assert_return(bus, -EINVAL);
491 assert_return(bus = bus_resolve(bus), -ENOPKG);
492 assert_return(!bus_pid_changed(bus), -ECHILD);
494 return bus->connected_signal;
497 static int synthesize_connected_signal(sd_bus *bus) {
498 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
503 /* If enabled, synthesizes a local "Connected" signal mirroring the local "Disconnected" signal. This is called
504 * whenever we fully established a connection, i.e. after the authorization phase, and after receiving the
505 * Hello() reply. Or in other words, whenver we enter BUS_RUNNING state.
507 * This is useful so that clients can start doing stuff whenver the connection is fully established in a way
508 * that works independently from whether we connected to a full bus or just a direct connection. */
510 if (!bus->connected_signal)
513 r = sd_bus_message_new_signal(
516 "/org/freedesktop/DBus/Local",
517 "org.freedesktop.DBus.Local",
522 bus_message_set_sender_local(bus, m);
524 r = bus_seal_synthetic_message(bus, m);
528 r = bus_rqueue_make_room(bus);
532 /* Insert at the very front */
533 memmove(bus->rqueue + 1, bus->rqueue, sizeof(sd_bus_message*) * bus->rqueue_size);
541 void bus_set_state(sd_bus *bus, enum bus_state state) {
543 static const char * const table[_BUS_STATE_MAX] = {
544 [BUS_UNSET] = "UNSET",
545 [BUS_WATCH_BIND] = "WATCH_BIND",
546 [BUS_OPENING] = "OPENING",
547 [BUS_AUTHENTICATING] = "AUTHENTICATING",
548 [BUS_HELLO] = "HELLO",
549 [BUS_RUNNING] = "RUNNING",
550 [BUS_CLOSING] = "CLOSING",
551 [BUS_CLOSED] = "CLOSED",
555 assert(state < _BUS_STATE_MAX);
557 if (state == bus->state)
560 log_debug("Bus %s: changing state %s → %s", strna(bus->description), table[bus->state], table[state]);
564 static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) {
573 assert(IN_SET(bus->state, BUS_HELLO, BUS_CLOSING));
575 r = sd_bus_message_get_errno(reply);
579 r = sd_bus_message_read(reply, "s", &s);
583 if (!service_name_is_valid(s) || s[0] != ':')
590 free_and_replace(bus->unique_name, t);
592 if (bus->state == BUS_HELLO) {
593 bus_set_state(bus, BUS_RUNNING);
595 r = synthesize_connected_signal(bus);
603 static int bus_send_hello(sd_bus *bus) {
604 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
609 if (!bus->bus_client)
612 r = sd_bus_message_new_method_call(
615 "org.freedesktop.DBus",
616 "/org/freedesktop/DBus",
617 "org.freedesktop.DBus",
622 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
625 int bus_start_running(sd_bus *bus) {
626 struct reply_callback *c;
632 assert(bus->state < BUS_HELLO);
634 /* We start all method call timeouts when we enter BUS_HELLO or BUS_RUNNING mode. At this point let's convert
635 * all relative to absolute timestamps. Note that we do not reshuffle the reply callback priority queue since
636 * adding a fixed value to all entries should not alter the internal order. */
638 n = now(CLOCK_MONOTONIC);
639 ORDERED_HASHMAP_FOREACH(c, bus->reply_callbacks, i) {
640 if (c->timeout_usec == 0)
643 c->timeout_usec = usec_add(n, c->timeout_usec);
646 if (bus->bus_client) {
647 bus_set_state(bus, BUS_HELLO);
651 bus_set_state(bus, BUS_RUNNING);
653 r = synthesize_connected_signal(bus);
660 static int parse_address_key(const char **p, const char *key, char **value) {
661 size_t l, n = 0, allocated = 0;
671 if (strncmp(*p, key, l) != 0)
684 while (!IN_SET(*a, ';', ',', 0)) {
702 c = (char) ((x << 4) | y);
709 if (!GREEDY_REALLOC(r, allocated, n + 2))
733 static void skip_address_key(const char **p) {
737 *p += strcspn(*p, ",");
743 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
744 _cleanup_free_ char *path = NULL, *abstract = NULL;
753 while (!IN_SET(**p, 0, ';')) {
754 r = parse_address_key(p, "guid", guid);
760 r = parse_address_key(p, "path", &path);
766 r = parse_address_key(p, "abstract", &abstract);
775 if (!path && !abstract)
778 if (path && abstract)
783 if (l > sizeof(b->sockaddr.un.sun_path))
786 b->sockaddr.un.sun_family = AF_UNIX;
787 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
788 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
789 } else if (abstract) {
790 l = strlen(abstract);
791 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
794 b->sockaddr.un.sun_family = AF_UNIX;
795 b->sockaddr.un.sun_path[0] = 0;
796 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
797 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
805 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
806 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
808 struct addrinfo *result, hints = {
809 .ai_socktype = SOCK_STREAM,
810 .ai_flags = AI_ADDRCONFIG,
818 while (!IN_SET(**p, 0, ';')) {
819 r = parse_address_key(p, "guid", guid);
825 r = parse_address_key(p, "host", &host);
831 r = parse_address_key(p, "port", &port);
837 r = parse_address_key(p, "family", &family);
850 if (streq(family, "ipv4"))
851 hints.ai_family = AF_INET;
852 else if (streq(family, "ipv6"))
853 hints.ai_family = AF_INET6;
858 r = getaddrinfo(host, port, &hints, &result);
862 return -EADDRNOTAVAIL;
864 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
865 b->sockaddr_size = result->ai_addrlen;
867 freeaddrinfo(result);
874 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
876 unsigned n_argv = 0, j;
878 size_t allocated = 0;
886 while (!IN_SET(**p, 0, ';')) {
887 r = parse_address_key(p, "guid", guid);
893 r = parse_address_key(p, "path", &path);
899 if (startswith(*p, "argv")) {
903 ul = strtoul(*p + 4, (char**) p, 10);
904 if (errno > 0 || **p != '=' || ul > 256) {
912 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
920 r = parse_address_key(p, NULL, argv + ul);
935 /* Make sure there are no holes in the array, with the
936 * exception of argv[0] */
937 for (j = 1; j < n_argv; j++)
943 if (argv && argv[0] == NULL) {
944 argv[0] = strdup(path);
959 for (j = 0; j < n_argv; j++)
967 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
968 _cleanup_free_ char *machine = NULL, *pid = NULL;
976 while (!IN_SET(**p, 0, ';')) {
977 r = parse_address_key(p, "guid", guid);
983 r = parse_address_key(p, "machine", &machine);
989 r = parse_address_key(p, "pid", &pid);
998 if (!machine == !pid)
1002 if (!machine_name_is_valid(machine))
1005 free_and_replace(b->machine, machine);
1007 b->machine = mfree(b->machine);
1011 r = parse_pid(pid, &b->nspid);
1017 b->sockaddr.un.sun_family = AF_UNIX;
1018 /* Note that we use the old /var/run prefix here, to increase compatibility with really old containers */
1019 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
1020 b->sockaddr_size = SOCKADDR_UN_LEN(b->sockaddr.un);
1021 b->is_local = false;
1026 static void bus_reset_parsed_address(sd_bus *b) {
1030 b->sockaddr_size = 0;
1031 b->exec_argv = strv_free(b->exec_argv);
1032 b->exec_path = mfree(b->exec_path);
1033 b->server_id = SD_ID128_NULL;
1034 b->machine = mfree(b->machine);
1038 static int bus_parse_next_address(sd_bus *b) {
1039 _cleanup_free_ char *guid = NULL;
1047 if (b->address[b->address_index] == 0)
1050 bus_reset_parsed_address(b);
1052 a = b->address + b->address_index;
1061 if (startswith(a, "unix:")) {
1064 r = parse_unix_address(b, &a, &guid);
1069 } else if (startswith(a, "tcp:")) {
1072 r = parse_tcp_address(b, &a, &guid);
1078 } else if (startswith(a, "unixexec:")) {
1081 r = parse_exec_address(b, &a, &guid);
1087 } else if (startswith(a, "x-machine-unix:")) {
1090 r = parse_container_unix_address(b, &a, &guid);
1103 r = sd_id128_from_string(guid, &b->server_id);
1108 b->address_index = a - b->address;
1112 static void bus_kill_exec(sd_bus *bus) {
1113 if (pid_is_valid(bus->busexec_pid) > 0) {
1114 sigterm_wait(bus->busexec_pid);
1115 bus->busexec_pid = 0;
1119 static int bus_start_address(sd_bus *b) {
1125 bus_close_io_fds(b);
1126 bus_close_inotify_fd(b);
1130 /* If you provide multiple different bus-addresses, we
1131 * try all of them in order and use the first one that
1135 r = bus_socket_exec(b);
1136 else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC)
1137 r = bus_container_connect_socket(b);
1138 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
1139 r = bus_socket_connect(b);
1146 q = bus_attach_io_events(b);
1150 q = bus_attach_inotify_event(b);
1157 b->last_connect_error = -r;
1160 r = bus_parse_next_address(b);
1164 return b->last_connect_error > 0 ? -b->last_connect_error : -ECONNREFUSED;
1168 int bus_next_address(sd_bus *b) {
1171 bus_reset_parsed_address(b);
1172 return bus_start_address(b);
1175 static int bus_start_fd(sd_bus *b) {
1180 assert(b->input_fd >= 0);
1181 assert(b->output_fd >= 0);
1183 r = fd_nonblock(b->input_fd, true);
1187 r = fd_cloexec(b->input_fd, true);
1191 if (b->input_fd != b->output_fd) {
1192 r = fd_nonblock(b->output_fd, true);
1196 r = fd_cloexec(b->output_fd, true);
1201 if (fstat(b->input_fd, &st) < 0)
1204 return bus_socket_take_fd(b);
1207 _public_ int sd_bus_start(sd_bus *bus) {
1210 assert_return(bus, -EINVAL);
1211 assert_return(bus = bus_resolve(bus), -ENOPKG);
1212 assert_return(bus->state == BUS_UNSET, -EPERM);
1213 assert_return(!bus_pid_changed(bus), -ECHILD);
1215 bus_set_state(bus, BUS_OPENING);
1217 if (bus->is_server && bus->bus_client)
1220 if (bus->input_fd >= 0)
1221 r = bus_start_fd(bus);
1222 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->machine)
1223 r = bus_start_address(bus);
1232 return bus_send_hello(bus);
1235 _public_ int sd_bus_open(sd_bus **ret) {
1240 assert_return(ret, -EINVAL);
1242 /* Let's connect to the starter bus if it is set, and
1243 * otherwise to the bus that is appropropriate for the scope
1244 * we are running in */
1246 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1248 if (streq(e, "system"))
1249 return sd_bus_open_system(ret);
1250 #if 0 /// elogind does not support systemd user instances
1251 else if (STR_IN_SET(e, "session", "user"))
1252 return sd_bus_open_user(ret);
1256 e = secure_getenv("DBUS_STARTER_ADDRESS");
1258 #if 0 /// elogind does not support systemd user instances
1259 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1260 return sd_bus_open_user(ret);
1263 return sd_bus_open_system(ret);
1270 r = sd_bus_set_address(b, e);
1274 b->bus_client = true;
1276 /* We don't know whether the bus is trusted or not, so better
1277 * be safe, and authenticate everything */
1279 b->is_local = false;
1280 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1282 r = sd_bus_start(b);
1294 int bus_set_address_system(sd_bus *b) {
1298 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1300 return sd_bus_set_address(b, e);
1302 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1305 _public_ int sd_bus_open_system(sd_bus **ret) {
1309 assert_return(ret, -EINVAL);
1315 r = bus_set_address_system(b);
1319 b->bus_client = true;
1320 b->is_system = true;
1322 /* Let's do per-method access control on the system bus. We
1323 * need the caller's UID and capability set for that. */
1325 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1328 r = sd_bus_start(b);
1340 #if 0 /// elogind can not open/use a user bus
1341 int bus_set_address_user(sd_bus *b) {
1343 _cleanup_free_ char *ee = NULL, *s = NULL;
1347 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1349 return sd_bus_set_address(b, e);
1351 e = secure_getenv("XDG_RUNTIME_DIR");
1355 ee = bus_address_escape(e);
1359 if (asprintf(&s, DEFAULT_USER_BUS_ADDRESS_FMT, ee) < 0)
1369 _public_ int sd_bus_open_user(sd_bus **ret) {
1370 #if 0 /// elogind does not support user buses
1374 assert_return(ret, -EINVAL);
1380 r = bus_set_address_user(b);
1384 b->bus_client = true;
1387 /* We don't do any per-method access control on the user
1392 r = sd_bus_start(b);
1403 return sd_bus_open_system(ret);
1407 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1408 _cleanup_free_ char *e = NULL;
1409 char *m = NULL, *c = NULL, *a;
1414 /* Let's see if we shall enter some container */
1415 m = strchr(host, ':');
1419 /* Let's make sure this is not a port of some kind,
1420 * and is a valid machine name. */
1421 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1424 /* Cut out the host part */
1425 t = strndupa(host, m - host - 1);
1426 e = bus_address_escape(t);
1430 c = strjoina(",argv5=--machine=", m);
1435 e = bus_address_escape(host);
1440 a = strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e, ",argv4=elogind-stdio-bridge", c);
1444 free_and_replace(b->address, a);
1449 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1453 assert_return(host, -EINVAL);
1454 assert_return(ret, -EINVAL);
1456 r = sd_bus_new(&bus);
1460 r = bus_set_address_system_remote(bus, host);
1464 bus->bus_client = true;
1465 bus->trusted = false;
1466 bus->is_system = true;
1467 bus->is_local = false;
1469 r = sd_bus_start(bus);
1481 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1482 _cleanup_free_ char *e = NULL;
1488 e = bus_address_escape(machine);
1492 a = strjoin("x-machine-unix:machine=", e);
1496 free_and_replace(b->address, a);
1501 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1505 assert_return(machine, -EINVAL);
1506 assert_return(ret, -EINVAL);
1507 assert_return(machine_name_is_valid(machine), -EINVAL);
1509 r = sd_bus_new(&bus);
1513 r = bus_set_address_system_machine(bus, machine);
1517 bus->bus_client = true;
1518 bus->trusted = false;
1519 bus->is_system = true;
1520 bus->is_local = false;
1522 r = sd_bus_start(bus);
1534 _public_ void sd_bus_close(sd_bus *bus) {
1538 if (bus->state == BUS_CLOSED)
1540 if (bus_pid_changed(bus))
1543 /* Don't leave ssh hanging around */
1546 bus_set_state(bus, BUS_CLOSED);
1548 sd_bus_detach_event(bus);
1550 /* Drop all queued messages so that they drop references to
1551 * the bus object and the bus may be freed */
1552 bus_reset_queues(bus);
1554 bus_close_io_fds(bus);
1555 bus_close_inotify_fd(bus);
1558 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1563 /* Have to do this before flush() to prevent hang */
1569 return sd_bus_unref(bus);
1572 void bus_enter_closing(sd_bus *bus) {
1575 if (!IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING, BUS_HELLO, BUS_RUNNING))
1578 bus_set_state(bus, BUS_CLOSING);
1581 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1586 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1591 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1597 i = REFCNT_DEC(bus->n_ref);
1605 _public_ int sd_bus_is_open(sd_bus *bus) {
1607 assert_return(bus, -EINVAL);
1608 assert_return(bus = bus_resolve(bus), -ENOPKG);
1609 assert_return(!bus_pid_changed(bus), -ECHILD);
1611 return BUS_IS_OPEN(bus->state);
1614 _public_ int sd_bus_is_ready(sd_bus *bus) {
1615 assert_return(bus, -EINVAL);
1616 assert_return(bus = bus_resolve(bus), -ENOPKG);
1617 assert_return(!bus_pid_changed(bus), -ECHILD);
1619 return bus->state == BUS_RUNNING;
1622 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1625 assert_return(bus, -EINVAL);
1626 assert_return(bus = bus_resolve(bus), -ENOPKG);
1627 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1628 assert_return(!bus_pid_changed(bus), -ECHILD);
1630 if (bus->is_monitor)
1633 if (type == SD_BUS_TYPE_UNIX_FD) {
1634 if (!bus->accept_fd)
1637 r = bus_ensure_running(bus);
1641 return bus->can_fds;
1644 return bus_type_is_valid(type);
1647 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1650 assert_return(bus, -EINVAL);
1651 assert_return(bus = bus_resolve(bus), -ENOPKG);
1652 assert_return(id, -EINVAL);
1653 assert_return(!bus_pid_changed(bus), -ECHILD);
1655 r = bus_ensure_running(bus);
1659 *id = bus->server_id;
1663 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1670 /* If we copy the same message to multiple
1671 * destinations, avoid using the same cookie
1673 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1678 timeout = BUS_DEFAULT_TIMEOUT;
1680 if (!m->sender && b->patch_sender) {
1681 r = sd_bus_message_set_sender(m, b->patch_sender);
1686 return sd_bus_message_seal(m, ++b->cookie, timeout);
1689 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1690 bool remarshal = false;
1694 /* wrong packet version */
1695 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1698 /* wrong packet endianness */
1699 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1702 return remarshal ? bus_message_remarshal(b, m) : 0;
1705 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1709 /* Fake some timestamps, if they were requested, and not
1710 * already initialized */
1711 if (b->attach_timestamp) {
1712 if (m->realtime <= 0)
1713 m->realtime = now(CLOCK_REALTIME);
1715 if (m->monotonic <= 0)
1716 m->monotonic = now(CLOCK_MONOTONIC);
1719 /* The bus specification says the serial number cannot be 0,
1720 * hence let's fill something in for synthetic messages. Since
1721 * synthetic messages might have a fake sender and we don't
1722 * want to interfere with the real sender's serial numbers we
1723 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1724 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1725 * even though kdbus can do 64bit. */
1726 return sd_bus_message_seal(m, 0xFFFFFFFFULL, 0);
1729 static int bus_write_message(sd_bus *bus, sd_bus_message *m, size_t *idx) {
1735 r = bus_socket_write_message(bus, m, idx);
1739 if (*idx >= BUS_MESSAGE_SIZE(m))
1740 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",
1741 bus_message_type_to_string(m->header->type),
1742 strna(sd_bus_message_get_sender(m)),
1743 strna(sd_bus_message_get_destination(m)),
1744 strna(sd_bus_message_get_path(m)),
1745 strna(sd_bus_message_get_interface(m)),
1746 strna(sd_bus_message_get_member(m)),
1747 BUS_MESSAGE_COOKIE(m),
1749 strna(m->root_container.signature),
1750 strna(m->error.name),
1751 strna(m->error.message));
1756 static int dispatch_wqueue(sd_bus *bus) {
1760 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1762 while (bus->wqueue_size > 0) {
1764 r = bus_write_message(bus, bus->wqueue[0], &bus->windex);
1768 /* Didn't do anything this time */
1770 else if (bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1771 /* Fully written. Let's drop the entry from
1774 * This isn't particularly optimized, but
1775 * well, this is supposed to be our worst-case
1776 * buffer only, and the socket buffer is
1777 * supposed to be our primary buffer, and if
1778 * it got full, then all bets are off
1782 sd_bus_message_unref(bus->wqueue[0]);
1783 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1793 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1796 return bus_socket_read_message(bus);
1799 int bus_rqueue_make_room(sd_bus *bus) {
1802 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1805 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1811 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1816 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1818 /* Note that the priority logic is only available on kdbus,
1819 * where the rqueue is unused. We check the rqueue here
1820 * anyway, because it's simple... */
1823 if (bus->rqueue_size > 0) {
1824 /* Dispatch a queued message */
1826 *m = bus->rqueue[0];
1828 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1832 /* Try to read a new message */
1833 r = bus_read_message(bus, hint_priority, priority);
1843 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie) {
1844 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1847 assert_return(m, -EINVAL);
1852 assert_return(!bus_pid_changed(bus), -ECHILD);
1854 if (!BUS_IS_OPEN(bus->state))
1858 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1865 /* If the cookie number isn't kept, then we know that no reply
1867 if (!cookie && !m->sealed)
1868 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1870 r = bus_seal_message(bus, m, 0);
1874 /* Remarshall if we have to. This will possibly unref the
1875 * message and place a replacement in m */
1876 r = bus_remarshal_message(bus, &m);
1880 /* If this is a reply and no reply was requested, then let's
1881 * suppress this, if we can */
1885 if (IN_SET(bus->state, BUS_RUNNING, BUS_HELLO) && bus->wqueue_size <= 0) {
1888 r = bus_write_message(bus, m, &idx);
1890 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
1891 bus_enter_closing(bus);
1898 if (idx < BUS_MESSAGE_SIZE(m)) {
1899 /* Wasn't fully written. So let's remember how
1900 * much was written. Note that the first entry
1901 * of the wqueue array is always allocated so
1902 * that we always can remember how much was
1904 bus->wqueue[0] = sd_bus_message_ref(m);
1905 bus->wqueue_size = 1;
1910 /* Just append it to the queue. */
1912 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1915 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1918 bus->wqueue[bus->wqueue_size++] = sd_bus_message_ref(m);
1923 *cookie = BUS_MESSAGE_COOKIE(m);
1928 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1931 assert_return(m, -EINVAL);
1936 assert_return(!bus_pid_changed(bus), -ECHILD);
1938 if (!BUS_IS_OPEN(bus->state))
1941 if (!streq_ptr(m->destination, destination)) {
1946 r = sd_bus_message_set_destination(m, destination);
1951 return sd_bus_send(bus, m, cookie);
1954 static usec_t calc_elapse(sd_bus *bus, uint64_t usec) {
1957 if (usec == (uint64_t) -1)
1960 /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
1961 * with any connection setup states. Hence, if a method callback is started earlier than that we just store the
1962 * relative timestamp, and afterwards the absolute one. */
1964 if (IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING))
1967 return now(CLOCK_MONOTONIC) + usec;
1970 static int timeout_compare(const void *a, const void *b) {
1971 const struct reply_callback *x = a, *y = b;
1973 if (x->timeout_usec != 0 && y->timeout_usec == 0)
1976 if (x->timeout_usec == 0 && y->timeout_usec != 0)
1979 if (x->timeout_usec < y->timeout_usec)
1982 if (x->timeout_usec > y->timeout_usec)
1988 _public_ int sd_bus_call_async(
1992 sd_bus_message_handler_t callback,
1996 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1997 _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *s = NULL;
2000 assert_return(m, -EINVAL);
2001 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
2002 assert_return(!m->sealed || (!!callback == !(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)), -EINVAL);
2007 assert_return(!bus_pid_changed(bus), -ECHILD);
2009 if (!BUS_IS_OPEN(bus->state))
2012 /* If no callback is specified and there's no interest in a slot, then there's no reason to ask for a reply */
2013 if (!callback && !slot && !m->sealed)
2014 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
2016 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
2020 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
2024 r = bus_seal_message(bus, m, usec);
2028 r = bus_remarshal_message(bus, &m);
2032 if (slot || callback) {
2033 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
2037 s->reply_callback.callback = callback;
2039 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
2040 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
2042 s->reply_callback.cookie = 0;
2046 s->reply_callback.timeout_usec = calc_elapse(bus, m->timeout);
2047 if (s->reply_callback.timeout_usec != 0) {
2048 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
2050 s->reply_callback.timeout_usec = 0;
2056 r = sd_bus_send(bus, m, s ? &s->reply_callback.cookie : NULL);
2067 int bus_ensure_running(sd_bus *bus) {
2072 if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
2074 if (bus->state == BUS_RUNNING)
2078 r = sd_bus_process(bus, NULL);
2081 if (bus->state == BUS_RUNNING)
2086 r = sd_bus_wait(bus, (uint64_t) -1);
2092 _public_ int sd_bus_call(
2096 sd_bus_error *error,
2097 sd_bus_message **reply) {
2099 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
2105 bus_assert_return(m, -EINVAL, error);
2106 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
2107 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
2108 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
2113 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
2115 if (!BUS_IS_OPEN(bus->state)) {
2120 r = bus_ensure_running(bus);
2124 i = bus->rqueue_size;
2126 r = bus_seal_message(bus, m, usec);
2130 r = bus_remarshal_message(bus, &m);
2134 r = sd_bus_send(bus, m, &cookie);
2138 timeout = calc_elapse(bus, m->timeout);
2143 while (i < bus->rqueue_size) {
2144 sd_bus_message *incoming = NULL;
2146 incoming = bus->rqueue[i];
2148 if (incoming->reply_cookie == cookie) {
2149 /* Found a match! */
2151 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2153 log_debug_bus_message(incoming);
2155 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2157 if (incoming->n_fds <= 0 || bus->accept_fd) {
2161 sd_bus_message_unref(incoming);
2166 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2167 sd_bus_message_unref(incoming);
2170 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
2171 r = sd_bus_error_copy(error, &incoming->error);
2172 sd_bus_message_unref(incoming);
2179 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2182 streq(bus->unique_name, incoming->sender)) {
2184 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2187 /* Our own message? Somebody is trying
2188 * to send its own client a message,
2189 * let's not dead-lock, let's fail
2192 sd_bus_message_unref(incoming);
2197 /* Try to read more, right-away */
2201 r = bus_read_message(bus, false, 0);
2203 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2204 bus_enter_closing(bus);
2216 n = now(CLOCK_MONOTONIC);
2224 left = (uint64_t) -1;
2226 r = bus_poll(bus, true, left);
2234 r = dispatch_wqueue(bus);
2236 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2237 bus_enter_closing(bus);
2246 return sd_bus_error_set_errno(error, r);
2249 _public_ int sd_bus_get_fd(sd_bus *bus) {
2251 assert_return(bus, -EINVAL);
2252 assert_return(bus = bus_resolve(bus), -ENOPKG);
2253 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2254 assert_return(!bus_pid_changed(bus), -ECHILD);
2256 if (bus->state == BUS_CLOSED)
2259 if (bus->inotify_fd >= 0)
2260 return bus->inotify_fd;
2262 if (bus->input_fd >= 0)
2263 return bus->input_fd;
2268 _public_ int sd_bus_get_events(sd_bus *bus) {
2271 assert_return(bus, -EINVAL);
2272 assert_return(bus = bus_resolve(bus), -ENOPKG);
2273 assert_return(!bus_pid_changed(bus), -ECHILD);
2275 switch (bus->state) {
2281 case BUS_WATCH_BIND:
2289 case BUS_AUTHENTICATING:
2290 if (bus_socket_auth_needs_write(bus))
2298 if (bus->rqueue_size <= 0)
2300 if (bus->wqueue_size > 0)
2308 assert_not_reached("Unknown state");
2314 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2315 struct reply_callback *c;
2317 assert_return(bus, -EINVAL);
2318 assert_return(bus = bus_resolve(bus), -ENOPKG);
2319 assert_return(timeout_usec, -EINVAL);
2320 assert_return(!bus_pid_changed(bus), -ECHILD);
2322 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2325 if (bus->track_queue) {
2330 switch (bus->state) {
2332 case BUS_AUTHENTICATING:
2333 *timeout_usec = bus->auth_timeout;
2338 if (bus->rqueue_size > 0) {
2343 c = prioq_peek(bus->reply_callbacks_prioq);
2345 *timeout_usec = (uint64_t) -1;
2349 if (c->timeout_usec == 0) {
2350 *timeout_usec = (uint64_t) -1;
2354 *timeout_usec = c->timeout_usec;
2361 case BUS_WATCH_BIND:
2363 *timeout_usec = (uint64_t) -1;
2367 assert_not_reached("Unknown or unexpected stat");
2371 static int process_timeout(sd_bus *bus) {
2372 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2373 _cleanup_(sd_bus_message_unrefp) sd_bus_message* m = NULL;
2374 struct reply_callback *c;
2381 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2383 c = prioq_peek(bus->reply_callbacks_prioq);
2387 n = now(CLOCK_MONOTONIC);
2388 if (c->timeout_usec > n)
2391 r = bus_message_new_synthetic_error(
2394 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2399 r = bus_seal_synthetic_message(bus, m);
2403 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2404 c->timeout_usec = 0;
2406 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2409 slot = container_of(c, sd_bus_slot, reply_callback);
2411 bus->iteration_counter++;
2413 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2415 bus->current_message = m;
2416 bus->current_slot = sd_bus_slot_ref(slot);
2417 bus->current_handler = c->callback;
2418 bus->current_userdata = slot->userdata;
2419 r = c->callback(m, slot->userdata, &error_buffer);
2420 bus->current_userdata = NULL;
2421 bus->current_handler = NULL;
2422 bus->current_slot = NULL;
2423 bus->current_message = NULL;
2425 if (slot->floating) {
2426 bus_slot_disconnect(slot);
2427 sd_bus_slot_unref(slot);
2430 sd_bus_slot_unref(slot);
2432 /* When this is the hello message and it timed out, then make sure to propagate the error up, don't just log
2433 * and ignore the callback handler's return value. */
2437 return bus_maybe_reply_error(m, r, &error_buffer);
2440 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2444 if (bus->state != BUS_HELLO)
2447 /* Let's make sure the first message on the bus is the HELLO
2448 * reply. But note that we don't actually parse the message
2449 * here (we leave that to the usual handling), we just verify
2450 * we don't let any earlier msg through. */
2452 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2455 if (m->reply_cookie != 1)
2461 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2462 _cleanup_(sd_bus_message_unrefp) sd_bus_message *synthetic_reply = NULL;
2463 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2464 struct reply_callback *c;
2472 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2475 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2478 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2484 slot = container_of(c, sd_bus_slot, reply_callback);
2486 if (m->n_fds > 0 && !bus->accept_fd) {
2488 /* If the reply contained a file descriptor which we
2489 * didn't want we pass an error instead. */
2491 r = bus_message_new_synthetic_error(
2494 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2499 /* Copy over original timestamp */
2500 synthetic_reply->realtime = m->realtime;
2501 synthetic_reply->monotonic = m->monotonic;
2502 synthetic_reply->seqnum = m->seqnum;
2504 r = bus_seal_synthetic_message(bus, synthetic_reply);
2508 m = synthetic_reply;
2510 r = sd_bus_message_rewind(m, true);
2515 if (c->timeout_usec != 0) {
2516 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2517 c->timeout_usec = 0;
2520 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2522 bus->current_slot = sd_bus_slot_ref(slot);
2523 bus->current_handler = c->callback;
2524 bus->current_userdata = slot->userdata;
2525 r = c->callback(m, slot->userdata, &error_buffer);
2526 bus->current_userdata = NULL;
2527 bus->current_handler = NULL;
2528 bus->current_slot = NULL;
2530 if (slot->floating) {
2531 bus_slot_disconnect(slot);
2532 sd_bus_slot_unref(slot);
2535 sd_bus_slot_unref(slot);
2537 /* When this is the hello message and it failed, then make sure to propagate the error up, don't just log and
2538 * ignore the callback handler's return value. */
2542 return bus_maybe_reply_error(m, r, &error_buffer);
2545 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2546 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2547 struct filter_callback *l;
2554 bus->filter_callbacks_modified = false;
2556 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2559 if (bus->filter_callbacks_modified)
2562 /* Don't run this more than once per iteration */
2563 if (l->last_iteration == bus->iteration_counter)
2566 l->last_iteration = bus->iteration_counter;
2568 r = sd_bus_message_rewind(m, true);
2572 slot = container_of(l, sd_bus_slot, filter_callback);
2574 bus->current_slot = sd_bus_slot_ref(slot);
2575 bus->current_handler = l->callback;
2576 bus->current_userdata = slot->userdata;
2577 r = l->callback(m, slot->userdata, &error_buffer);
2578 bus->current_userdata = NULL;
2579 bus->current_handler = NULL;
2580 bus->current_slot = sd_bus_slot_unref(slot);
2582 r = bus_maybe_reply_error(m, r, &error_buffer);
2588 } while (bus->filter_callbacks_modified);
2593 static int process_match(sd_bus *bus, sd_bus_message *m) {
2600 bus->match_callbacks_modified = false;
2602 r = bus_match_run(bus, &bus->match_callbacks, m);
2606 } while (bus->match_callbacks_modified);
2611 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2612 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
2618 if (bus->is_monitor)
2621 if (bus->manual_peer_interface)
2624 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2627 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2630 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2633 if (streq_ptr(m->member, "Ping"))
2634 r = sd_bus_message_new_method_return(m, &reply);
2635 else if (streq_ptr(m->member, "GetMachineId")) {
2639 r = sd_id128_get_machine(&id);
2643 r = sd_bus_message_new_method_return(m, &reply);
2647 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2649 r = sd_bus_message_new_method_errorf(
2651 SD_BUS_ERROR_UNKNOWN_METHOD,
2652 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2658 r = sd_bus_send(bus, reply, NULL);
2665 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2669 /* If we got a message with a file descriptor which we didn't
2670 * want to accept, then let's drop it. How can this even
2671 * happen? For example, when the kernel queues a message into
2672 * an activatable names's queue which allows fds, and then is
2673 * delivered to us later even though we ourselves did not
2676 if (bus->is_monitor)
2685 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2686 return 1; /* just eat it up */
2688 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2691 static int process_message(sd_bus *bus, sd_bus_message *m) {
2697 bus->current_message = m;
2698 bus->iteration_counter++;
2700 log_debug_bus_message(m);
2702 r = process_hello(bus, m);
2706 r = process_reply(bus, m);
2710 r = process_fd_check(bus, m);
2714 r = process_filter(bus, m);
2718 r = process_match(bus, m);
2722 r = process_builtin(bus, m);
2726 r = bus_process_object(bus, m);
2729 bus->current_message = NULL;
2733 static int dispatch_track(sd_bus *bus) {
2736 if (!bus->track_queue)
2739 bus_track_dispatch(bus->track_queue);
2743 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2744 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2748 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2750 r = process_timeout(bus);
2754 r = dispatch_wqueue(bus);
2758 r = dispatch_track(bus);
2762 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2768 r = process_message(bus, m);
2773 r = sd_bus_message_rewind(m, true);
2782 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2784 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2785 strna(sd_bus_message_get_sender(m)),
2786 strna(sd_bus_message_get_path(m)),
2787 strna(sd_bus_message_get_interface(m)),
2788 strna(sd_bus_message_get_member(m)));
2790 r = sd_bus_reply_method_errorf(
2792 SD_BUS_ERROR_UNKNOWN_OBJECT,
2793 "Unknown object '%s'.", m->path);
2807 static int bus_exit_now(sd_bus *bus) {
2810 /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
2811 * sd_event_exit(), otherwise invokes libc exit(). */
2813 if (bus->exited) /* did we already exit? */
2815 if (!bus->exit_triggered) /* was the exit condition triggered? */
2817 if (!bus->exit_on_disconnect) /* Shall we actually exit on disconnection? */
2820 bus->exited = true; /* never exit more than once */
2822 log_debug("Bus connection disconnected, exiting.");
2825 return sd_event_exit(bus->event, EXIT_FAILURE);
2829 assert_not_reached("exit() didn't exit?");
2832 static int process_closing_reply_callback(sd_bus *bus, struct reply_callback *c) {
2833 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2834 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2841 r = bus_message_new_synthetic_error(
2844 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2849 r = bus_seal_synthetic_message(bus, m);
2853 if (c->timeout_usec != 0) {
2854 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2855 c->timeout_usec = 0;
2858 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2861 slot = container_of(c, sd_bus_slot, reply_callback);
2863 bus->iteration_counter++;
2865 bus->current_message = m;
2866 bus->current_slot = sd_bus_slot_ref(slot);
2867 bus->current_handler = c->callback;
2868 bus->current_userdata = slot->userdata;
2869 r = c->callback(m, slot->userdata, &error_buffer);
2870 bus->current_userdata = NULL;
2871 bus->current_handler = NULL;
2872 bus->current_slot = NULL;
2873 bus->current_message = NULL;
2875 if (slot->floating) {
2876 bus_slot_disconnect(slot);
2877 sd_bus_slot_unref(slot);
2880 sd_bus_slot_unref(slot);
2882 return bus_maybe_reply_error(m, r, &error_buffer);
2885 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2886 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2887 struct reply_callback *c;
2891 assert(bus->state == BUS_CLOSING);
2893 /* First, fail all outstanding method calls */
2894 c = ordered_hashmap_first(bus->reply_callbacks);
2896 return process_closing_reply_callback(bus, c);
2898 /* Then, fake-drop all remaining bus tracking references */
2900 bus_track_close(bus->tracks);
2904 /* Then, synthesize a Disconnected message */
2905 r = sd_bus_message_new_signal(
2908 "/org/freedesktop/DBus/Local",
2909 "org.freedesktop.DBus.Local",
2914 bus_message_set_sender_local(bus, m);
2916 r = bus_seal_synthetic_message(bus, m);
2922 bus->current_message = m;
2923 bus->iteration_counter++;
2925 r = process_filter(bus, m);
2929 r = process_match(bus, m);
2933 /* Nothing else to do, exit now, if the condition holds */
2934 bus->exit_triggered = true;
2935 (void) bus_exit_now(bus);
2945 bus->current_message = NULL;
2950 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2951 BUS_DONT_DESTROY(bus);
2954 /* Returns 0 when we didn't do anything. This should cause the
2955 * caller to invoke sd_bus_wait() before returning the next
2956 * time. Returns > 0 when we did something, which possibly
2957 * means *ret is filled in with an unprocessed message. */
2959 assert_return(bus, -EINVAL);
2960 assert_return(bus = bus_resolve(bus), -ENOPKG);
2961 assert_return(!bus_pid_changed(bus), -ECHILD);
2963 /* We don't allow recursively invoking sd_bus_process(). */
2964 assert_return(!bus->current_message, -EBUSY);
2965 assert(!bus->current_slot);
2967 switch (bus->state) {
2975 case BUS_WATCH_BIND:
2976 r = bus_socket_process_watch_bind(bus);
2980 r = bus_socket_process_opening(bus);
2983 case BUS_AUTHENTICATING:
2984 r = bus_socket_process_authenticating(bus);
2989 r = process_running(bus, hint_priority, priority, ret);
2993 /* This branch initializes *ret, hence we don't use the generic error checking below */
2997 return process_closing(bus, ret);
3000 assert_not_reached("Unknown state");
3003 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
3004 bus_enter_closing(bus);
3015 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
3016 return bus_process_internal(bus, false, 0, ret);
3019 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
3020 return bus_process_internal(bus, true, priority, ret);
3023 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
3024 struct pollfd p[2] = {};
3027 usec_t m = USEC_INFINITY;
3031 if (bus->state == BUS_CLOSING)
3034 if (!BUS_IS_OPEN(bus->state))
3037 if (bus->state == BUS_WATCH_BIND) {
3038 assert(bus->inotify_fd >= 0);
3040 p[0].events = POLLIN;
3041 p[0].fd = bus->inotify_fd;
3046 e = sd_bus_get_events(bus);
3051 /* The caller really needs some more data, he doesn't
3052 * care about what's already read, or any timeouts
3053 * except its own. */
3057 /* The caller wants to process if there's something to
3058 * process, but doesn't care otherwise */
3060 r = sd_bus_get_timeout(bus, &until);
3064 m = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
3067 p[0].fd = bus->input_fd;
3068 if (bus->output_fd == bus->input_fd) {
3072 p[0].events = e & POLLIN;
3073 p[1].fd = bus->output_fd;
3074 p[1].events = e & POLLOUT;
3079 if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
3082 r = ppoll(p, n, m == USEC_INFINITY ? NULL : timespec_store(&ts, m), NULL);
3086 return r > 0 ? 1 : 0;
3089 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
3091 assert_return(bus, -EINVAL);
3092 assert_return(bus = bus_resolve(bus), -ENOPKG);
3093 assert_return(!bus_pid_changed(bus), -ECHILD);
3095 if (bus->state == BUS_CLOSING)
3098 if (!BUS_IS_OPEN(bus->state))
3101 if (bus->rqueue_size > 0)
3104 return bus_poll(bus, false, timeout_usec);
3107 _public_ int sd_bus_flush(sd_bus *bus) {
3110 assert_return(bus, -EINVAL);
3111 assert_return(bus = bus_resolve(bus), -ENOPKG);
3112 assert_return(!bus_pid_changed(bus), -ECHILD);
3114 if (bus->state == BUS_CLOSING)
3117 if (!BUS_IS_OPEN(bus->state))
3120 /* We never were connected? Don't hang in inotify for good, as there's no timeout set for it */
3121 if (bus->state == BUS_WATCH_BIND)
3124 r = bus_ensure_running(bus);
3128 if (bus->wqueue_size <= 0)
3132 r = dispatch_wqueue(bus);
3134 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
3135 bus_enter_closing(bus);
3142 if (bus->wqueue_size <= 0)
3145 r = bus_poll(bus, false, (uint64_t) -1);
3151 _public_ int sd_bus_add_filter(
3154 sd_bus_message_handler_t callback,
3159 assert_return(bus, -EINVAL);
3160 assert_return(bus = bus_resolve(bus), -ENOPKG);
3161 assert_return(callback, -EINVAL);
3162 assert_return(!bus_pid_changed(bus), -ECHILD);
3164 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
3168 s->filter_callback.callback = callback;
3170 bus->filter_callbacks_modified = true;
3171 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
3179 static int add_match_callback(
3182 sd_bus_error *ret_error) {
3184 sd_bus_slot *match_slot = userdata;
3185 bool failed = false;
3191 sd_bus_slot_ref(match_slot);
3193 if (sd_bus_message_is_method_error(m, NULL)) {
3194 log_debug_errno(sd_bus_message_get_errno(m),
3195 "Unable to add match %s, failing connection: %s",
3196 match_slot->match_callback.match_string,
3197 sd_bus_message_get_error(m)->message);
3201 log_debug("Match %s successfully installed.", match_slot->match_callback.match_string);
3203 if (match_slot->match_callback.install_callback) {
3206 bus = sd_bus_message_get_bus(m);
3208 /* This function has been called as slot handler, and we want to call another slot handler. Let's
3209 * update the slot callback metadata temporarily with our own data, and then revert back to the old
3212 assert(bus->current_slot == match_slot->match_callback.install_slot);
3213 assert(bus->current_handler == add_match_callback);
3214 assert(bus->current_userdata == userdata);
3216 bus->current_slot = match_slot;
3217 bus->current_handler = match_slot->match_callback.install_callback;
3218 bus->current_userdata = match_slot->userdata;
3220 r = match_slot->match_callback.install_callback(m, match_slot->userdata, ret_error);
3222 bus->current_slot = match_slot->match_callback.install_slot;
3223 bus->current_handler = add_match_callback;
3224 bus->current_userdata = userdata;
3226 match_slot->match_callback.install_slot = sd_bus_slot_unref(match_slot->match_callback.install_slot);
3228 if (failed) /* Generic failure handling: destroy the connection */
3229 bus_enter_closing(sd_bus_message_get_bus(m));
3234 if (failed && match_slot->floating) {
3235 bus_slot_disconnect(match_slot);
3236 sd_bus_slot_unref(match_slot);
3239 sd_bus_slot_unref(match_slot);
3244 static int bus_add_match_full(
3249 sd_bus_message_handler_t callback,
3250 sd_bus_message_handler_t install_callback,
3253 struct bus_match_component *components = NULL;
3254 unsigned n_components = 0;
3255 sd_bus_slot *s = NULL;
3258 assert_return(bus, -EINVAL);
3259 assert_return(bus = bus_resolve(bus), -ENOPKG);
3260 assert_return(match, -EINVAL);
3261 assert_return(!bus_pid_changed(bus), -ECHILD);
3263 r = bus_match_parse(match, &components, &n_components);
3267 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
3273 s->match_callback.callback = callback;
3274 s->match_callback.install_callback = install_callback;
3276 if (bus->bus_client) {
3277 enum bus_match_scope scope;
3279 scope = bus_match_get_scope(components, n_components);
3281 /* Do not install server-side matches for matches against the local service, interface or bus path. */
3282 if (scope != BUS_MATCH_LOCAL) {
3284 /* We store the original match string, so that we can use it to remove the match again. */
3286 s->match_callback.match_string = strdup(match);
3287 if (!s->match_callback.match_string) {
3293 r = bus_add_match_internal_async(bus,
3294 &s->match_callback.install_slot,
3295 s->match_callback.match_string,
3299 r = bus_add_match_internal(bus, s->match_callback.match_string);
3303 s->match_added = true;
3307 bus->match_callbacks_modified = true;
3308 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3317 bus_match_parse_free(components, n_components);
3318 sd_bus_slot_unref(s);
3323 #if 0 /// UNNEEDED by elogind
3325 _public_ int sd_bus_add_match(
3329 sd_bus_message_handler_t callback,
3332 return bus_add_match_full(bus, slot, false, match, callback, NULL, userdata);
3335 _public_ int sd_bus_add_match_async(
3339 sd_bus_message_handler_t callback,
3340 sd_bus_message_handler_t install_callback,
3343 return bus_add_match_full(bus, slot, true, match, callback, install_callback, userdata);
3346 bool bus_pid_changed(sd_bus *bus) {
3349 /* We don't support people creating a bus connection and
3350 * keeping it around over a fork(). Let's complain. */
3352 return bus->original_pid != getpid_cached();
3355 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3356 sd_bus *bus = userdata;
3361 /* Note that this is called both on input_fd, output_fd as well as inotify_fd events */
3363 r = sd_bus_process(bus, NULL);
3365 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3366 bus_enter_closing(bus);
3372 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3373 sd_bus *bus = userdata;
3378 r = sd_bus_process(bus, NULL);
3380 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3381 bus_enter_closing(bus);
3387 static int prepare_callback(sd_event_source *s, void *userdata) {
3388 sd_bus *bus = userdata;
3395 e = sd_bus_get_events(bus);
3401 if (bus->output_fd != bus->input_fd) {
3403 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3407 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3409 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3413 r = sd_bus_get_timeout(bus, &until);
3419 j = sd_event_source_set_time(bus->time_event_source, until);
3426 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3433 log_debug_errno(r, "Preparing of bus events failed, closing down: %m");
3434 bus_enter_closing(bus);
3439 static int quit_callback(sd_event_source *event, void *userdata) {
3440 sd_bus *bus = userdata;
3450 int bus_attach_io_events(sd_bus *bus) {
3455 if (bus->input_fd < 0)
3461 if (!bus->input_io_event_source) {
3462 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3466 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3470 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3474 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3476 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3481 if (bus->output_fd != bus->input_fd) {
3482 assert(bus->output_fd >= 0);
3484 if (!bus->output_io_event_source) {
3485 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3489 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3493 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3495 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3504 static void bus_detach_io_events(sd_bus *bus) {
3507 if (bus->input_io_event_source) {
3508 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3509 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3512 if (bus->output_io_event_source) {
3513 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3514 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3518 int bus_attach_inotify_event(sd_bus *bus) {
3523 if (bus->inotify_fd < 0)
3529 if (!bus->inotify_event_source) {
3530 r = sd_event_add_io(bus->event, &bus->inotify_event_source, bus->inotify_fd, EPOLLIN, io_callback, bus);
3534 r = sd_event_source_set_priority(bus->inotify_event_source, bus->event_priority);
3538 r = sd_event_source_set_description(bus->inotify_event_source, "bus-inotify");
3540 r = sd_event_source_set_io_fd(bus->inotify_event_source, bus->inotify_fd);
3547 static void bus_detach_inotify_event(sd_bus *bus) {
3550 if (bus->inotify_event_source) {
3551 sd_event_source_set_enabled(bus->inotify_event_source, SD_EVENT_OFF);
3552 bus->inotify_event_source = sd_event_source_unref(bus->inotify_event_source);
3556 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3559 assert_return(bus, -EINVAL);
3560 assert_return(bus = bus_resolve(bus), -ENOPKG);
3561 assert_return(!bus->event, -EBUSY);
3563 assert(!bus->input_io_event_source);
3564 assert(!bus->output_io_event_source);
3565 assert(!bus->time_event_source);
3568 bus->event = sd_event_ref(event);
3570 r = sd_event_default(&bus->event);
3575 bus->event_priority = priority;
3577 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3581 r = sd_event_source_set_priority(bus->time_event_source, priority);
3585 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3589 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3593 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3597 r = bus_attach_io_events(bus);
3601 r = bus_attach_inotify_event(bus);
3608 sd_bus_detach_event(bus);
3612 _public_ int sd_bus_detach_event(sd_bus *bus) {
3613 assert_return(bus, -EINVAL);
3614 assert_return(bus = bus_resolve(bus), -ENOPKG);
3619 bus_detach_io_events(bus);
3620 bus_detach_inotify_event(bus);
3622 if (bus->time_event_source) {
3623 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3624 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3627 if (bus->quit_event_source) {
3628 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3629 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3632 bus->event = sd_event_unref(bus->event);
3636 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3637 assert_return(bus, NULL);
3642 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3643 assert_return(bus, NULL);
3645 return bus->current_message;
3648 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3649 assert_return(bus, NULL);
3651 return bus->current_slot;
3654 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3655 assert_return(bus, NULL);
3657 return bus->current_handler;
3660 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3661 assert_return(bus, NULL);
3663 return bus->current_userdata;
3666 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3671 assert(default_bus);
3674 return !!*default_bus;
3677 *ret = sd_bus_ref(*default_bus);
3685 b->default_bus_ptr = default_bus;
3693 _public_ int sd_bus_default_system(sd_bus **ret) {
3694 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3698 _public_ int sd_bus_default_user(sd_bus **ret) {
3699 #if 0 /// elogind does not support user buses
3700 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3702 return sd_bus_default_system(ret);
3706 _public_ int sd_bus_default(sd_bus **ret) {
3707 int (*bus_open)(sd_bus **) = NULL;
3710 #if 0 /// elogind does not support systemd units
3713 #if 0 /// elogind does not support systemd user instances
3715 busp = bus_choose_default(&bus_open);
3716 return bus_default(bus_open, busp, ret);
3719 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3720 assert_return(b, -EINVAL);
3721 assert_return(tid, -EINVAL);
3722 assert_return(!bus_pid_changed(b), -ECHILD);
3730 return sd_event_get_tid(b->event, tid);
3735 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3736 _cleanup_free_ char *e = NULL;
3739 assert_return(object_path_is_valid(prefix), -EINVAL);
3740 assert_return(external_id, -EINVAL);
3741 assert_return(ret_path, -EINVAL);
3743 e = bus_label_escape(external_id);
3747 ret = strjoin(prefix, "/", e);
3755 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3759 assert_return(object_path_is_valid(path), -EINVAL);
3760 assert_return(object_path_is_valid(prefix), -EINVAL);
3761 assert_return(external_id, -EINVAL);
3763 e = object_path_startswith(path, prefix);
3765 *external_id = NULL;
3769 ret = bus_label_unescape(e);
3777 _public_ int sd_bus_path_encode_many(char **out, const char *path_template, ...) {
3778 _cleanup_strv_free_ char **labels = NULL;
3779 char *path, *path_pos, **label_pos;
3780 const char *sep, *template_pos;
3785 assert_return(out, -EINVAL);
3786 assert_return(path_template, -EINVAL);
3788 path_length = strlen(path_template);
3790 va_start(list, path_template);
3791 for (sep = strchr(path_template, '%'); sep; sep = strchr(sep + 1, '%')) {
3795 arg = va_arg(list, const char *);
3801 label = bus_label_escape(arg);
3807 r = strv_consume(&labels, label);
3813 /* add label length, but account for the format character */
3814 path_length += strlen(label) - 1;
3818 path = malloc(path_length + 1);
3825 for (template_pos = path_template; *template_pos; ) {
3826 sep = strchrnul(template_pos, '%');
3827 path_pos = mempcpy(path_pos, template_pos, sep - template_pos);
3831 path_pos = stpcpy(path_pos, *label_pos++);
3832 template_pos = sep + 1;
3840 _public_ int sd_bus_path_decode_many(const char *path, const char *path_template, ...) {
3841 _cleanup_strv_free_ char **labels = NULL;
3842 const char *template_pos, *path_pos;
3848 * This decodes an object-path based on a template argument. The
3849 * template consists of a verbatim path, optionally including special
3852 * - Each occurrence of '%' in the template matches an arbitrary
3853 * substring of a label in the given path. At most one such
3854 * directive is allowed per label. For each such directive, the
3855 * caller must provide an output parameter (char **) via va_arg. If
3856 * NULL is passed, the given label is verified, but not returned.
3857 * For each matched label, the *decoded* label is stored in the
3858 * passed output argument, and the caller is responsible to free
3859 * it. Note that the output arguments are only modified if the
3860 * actualy path matched the template. Otherwise, they're left
3863 * This function returns <0 on error, 0 if the path does not match the
3864 * template, 1 if it matched.
3867 assert_return(path, -EINVAL);
3868 assert_return(path_template, -EINVAL);
3872 for (template_pos = path_template; *template_pos; ) {
3877 /* verify everything until the next '%' matches verbatim */
3878 sep = strchrnul(template_pos, '%');
3879 length = sep - template_pos;
3880 if (strncmp(path_pos, template_pos, length))
3884 template_pos += length;
3889 /* We found the next '%' character. Everything up until here
3890 * matched. We now skip ahead to the end of this label and make
3891 * sure it matches the tail of the label in the path. Then we
3892 * decode the string in-between and save it for later use. */
3894 ++template_pos; /* skip over '%' */
3896 sep = strchrnul(template_pos, '/');
3897 length = sep - template_pos; /* length of suffix to match verbatim */
3899 /* verify the suffixes match */
3900 sep = strchrnul(path_pos, '/');
3901 if (sep - path_pos < (ssize_t)length ||
3902 strncmp(sep - length, template_pos, length))
3905 template_pos += length; /* skip over matched label */
3906 length = sep - path_pos - length; /* length of sub-label to decode */
3908 /* store unescaped label for later use */
3909 label = bus_label_unescape_n(path_pos, length);
3913 r = strv_consume(&labels, label);
3917 path_pos = sep; /* skip decoded label and suffix */
3920 /* end of template must match end of path */
3924 /* copy the labels over to the caller */
3925 va_start(list, path_template);
3926 for (label_pos = labels; label_pos && *label_pos; ++label_pos) {
3929 arg = va_arg(list, char **);
3937 labels = mfree(labels);
3941 _public_ int sd_bus_try_close(sd_bus *bus) {
3942 assert_return(bus, -EINVAL);
3943 assert_return(bus = bus_resolve(bus), -ENOPKG);
3944 assert_return(!bus_pid_changed(bus), -ECHILD);
3949 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3950 assert_return(bus, -EINVAL);
3951 assert_return(bus = bus_resolve(bus), -ENOPKG);
3952 assert_return(description, -EINVAL);
3953 assert_return(bus->description, -ENXIO);
3954 assert_return(!bus_pid_changed(bus), -ECHILD);
3956 *description = bus->description;
3960 int bus_get_root_path(sd_bus *bus) {
3963 if (bus->cgroup_root)
3966 r = cg_get_root_path(&bus->cgroup_root);
3968 bus->cgroup_root = strdup("/");
3969 if (!bus->cgroup_root)
3978 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3979 assert_return(bus, -EINVAL);
3980 assert_return(bus = bus_resolve(bus), -ENOPKG);
3981 assert_return(scope, -EINVAL);
3982 assert_return(!bus_pid_changed(bus), -ECHILD);
3989 if (bus->is_system) {
3997 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
3999 assert_return(bus, -EINVAL);
4000 assert_return(bus = bus_resolve(bus), -ENOPKG);
4001 assert_return(address, -EINVAL);
4002 assert_return(!bus_pid_changed(bus), -ECHILD);
4005 *address = bus->address;
4012 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
4013 assert_return(bus, -EINVAL);
4014 assert_return(bus = bus_resolve(bus), -ENOPKG);
4015 assert_return(mask, -EINVAL);
4016 assert_return(!bus_pid_changed(bus), -ECHILD);
4018 *mask = bus->creds_mask;
4022 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
4023 assert_return(bus, -EINVAL);
4024 assert_return(bus = bus_resolve(bus), -ENOPKG);
4025 assert_return(!bus_pid_changed(bus), -ECHILD);
4027 return bus->bus_client;
4030 _public_ int sd_bus_is_server(sd_bus *bus) {
4031 assert_return(bus, -EINVAL);
4032 assert_return(bus = bus_resolve(bus), -ENOPKG);
4033 assert_return(!bus_pid_changed(bus), -ECHILD);
4035 return bus->is_server;
4038 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
4039 assert_return(bus, -EINVAL);
4040 assert_return(bus = bus_resolve(bus), -ENOPKG);
4041 assert_return(!bus_pid_changed(bus), -ECHILD);
4043 return bus->anonymous_auth;
4046 _public_ int sd_bus_is_trusted(sd_bus *bus) {
4047 assert_return(bus, -EINVAL);
4048 assert_return(bus = bus_resolve(bus), -ENOPKG);
4049 assert_return(!bus_pid_changed(bus), -ECHILD);
4051 return bus->trusted;
4054 _public_ int sd_bus_is_monitor(sd_bus *bus) {
4055 assert_return(bus, -EINVAL);
4056 assert_return(bus = bus_resolve(bus), -ENOPKG);
4057 assert_return(!bus_pid_changed(bus), -ECHILD);
4059 return bus->is_monitor;
4062 static void flush_close(sd_bus *bus) {
4066 /* Flushes and closes the specified bus. We take a ref before,
4067 * to ensure the flushing does not cause the bus to be
4070 sd_bus_flush_close_unref(sd_bus_ref(bus));
4073 _public_ void sd_bus_default_flush_close(void) {
4074 flush_close(default_starter_bus);
4075 #if 0 /// elogind does not support user buses
4076 flush_close(default_user_bus);
4078 flush_close(default_system_bus);
4081 _public_ int sd_bus_set_exit_on_disconnect(sd_bus *bus, int b) {
4082 assert_return(bus, -EINVAL);
4083 assert_return(bus = bus_resolve(bus), -ENOPKG);
4085 /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
4086 * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
4087 * from the client side. */
4088 bus->exit_on_disconnect = b;
4090 /* If the exit condition was triggered already, exit immediately. */
4091 return bus_exit_now(bus);
4094 _public_ int sd_bus_get_exit_on_disconnect(sd_bus *bus) {
4095 assert_return(bus, -EINVAL);
4096 assert_return(bus = bus_resolve(bus), -ENOPKG);
4098 return bus->exit_on_disconnect;
4101 _public_ int sd_bus_set_sender(sd_bus *bus, const char *sender) {
4102 assert_return(bus, -EINVAL);
4103 assert_return(bus = bus_resolve(bus), -ENOPKG);
4104 assert_return(!bus->bus_client, -EPERM);
4105 assert_return(!sender || service_name_is_valid(sender), -EINVAL);
4107 return free_and_strdup(&bus->patch_sender, sender);
4110 _public_ int sd_bus_get_sender(sd_bus *bus, const char **ret) {
4111 assert_return(bus, -EINVAL);
4112 assert_return(bus = bus_resolve(bus), -ENOPKG);
4113 assert_return(ret, -EINVAL);
4115 if (!bus->patch_sender)
4118 *ret = bus->patch_sender;