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);
296 free_and_replace(bus->address, a);
301 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
302 assert_return(bus, -EINVAL);
303 assert_return(bus = bus_resolve(bus), -ENOPKG);
304 assert_return(bus->state == BUS_UNSET, -EPERM);
305 assert_return(input_fd >= 0, -EBADF);
306 assert_return(output_fd >= 0, -EBADF);
307 assert_return(!bus_pid_changed(bus), -ECHILD);
309 bus->input_fd = input_fd;
310 bus->output_fd = output_fd;
314 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
317 assert_return(bus, -EINVAL);
318 assert_return(bus = bus_resolve(bus), -ENOPKG);
319 assert_return(bus->state == BUS_UNSET, -EPERM);
320 assert_return(path, -EINVAL);
321 assert_return(!strv_isempty(argv), -EINVAL);
322 assert_return(!bus_pid_changed(bus), -ECHILD);
334 free_and_replace(bus->exec_path, p);
336 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);
359 bus->is_monitor = !!b;
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);
369 bus->accept_fd = !!b;
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);
465 bus->watch_bind = !!b;
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) {
571 assert(IN_SET(bus->state, BUS_HELLO, BUS_CLOSING));
573 r = sd_bus_message_get_errno(reply);
577 r = sd_bus_message_read(reply, "s", &s);
581 if (!service_name_is_valid(s) || s[0] != ':')
588 free_and_replace(bus->unique_name, t);
590 if (bus->state == BUS_HELLO) {
591 bus_set_state(bus, BUS_RUNNING);
593 r = synthesize_connected_signal(bus);
601 static int bus_send_hello(sd_bus *bus) {
602 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
607 if (!bus->bus_client)
610 r = sd_bus_message_new_method_call(
613 "org.freedesktop.DBus",
614 "/org/freedesktop/DBus",
615 "org.freedesktop.DBus",
620 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
623 int bus_start_running(sd_bus *bus) {
624 struct reply_callback *c;
630 assert(bus->state < BUS_HELLO);
632 /* We start all method call timeouts when we enter BUS_HELLO or BUS_RUNNING mode. At this point let's convert
633 * all relative to absolute timestamps. Note that we do not reshuffle the reply callback priority queue since
634 * adding a fixed value to all entries should not alter the internal order. */
636 n = now(CLOCK_MONOTONIC);
637 ORDERED_HASHMAP_FOREACH(c, bus->reply_callbacks, i) {
638 if (c->timeout_usec == 0)
641 c->timeout_usec = usec_add(n, c->timeout_usec);
644 if (bus->bus_client) {
645 bus_set_state(bus, BUS_HELLO);
649 bus_set_state(bus, BUS_RUNNING);
651 r = synthesize_connected_signal(bus);
658 static int parse_address_key(const char **p, const char *key, char **value) {
659 size_t l, n = 0, allocated = 0;
660 _cleanup_free_ char *r = NULL;
669 if (strncmp(*p, key, l) != 0)
682 while (!IN_SET(*a, ';', ',', 0)) {
696 c = (char) ((x << 4) | y);
703 if (!GREEDY_REALLOC(r, allocated, n + 2))
721 free_and_replace(*value, r);
726 static void skip_address_key(const char **p) {
730 *p += strcspn(*p, ",");
736 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
737 _cleanup_free_ char *path = NULL, *abstract = NULL;
746 while (!IN_SET(**p, 0, ';')) {
747 r = parse_address_key(p, "guid", guid);
753 r = parse_address_key(p, "path", &path);
759 r = parse_address_key(p, "abstract", &abstract);
768 if (!path && !abstract)
771 if (path && abstract)
776 if (l > sizeof(b->sockaddr.un.sun_path))
779 b->sockaddr.un.sun_family = AF_UNIX;
780 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
781 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
782 } else if (abstract) {
783 l = strlen(abstract);
784 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
787 b->sockaddr.un.sun_family = AF_UNIX;
788 b->sockaddr.un.sun_path[0] = 0;
789 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
790 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
798 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
799 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
801 struct addrinfo *result, hints = {
802 .ai_socktype = SOCK_STREAM,
803 .ai_flags = AI_ADDRCONFIG,
811 while (!IN_SET(**p, 0, ';')) {
812 r = parse_address_key(p, "guid", guid);
818 r = parse_address_key(p, "host", &host);
824 r = parse_address_key(p, "port", &port);
830 r = parse_address_key(p, "family", &family);
843 if (streq(family, "ipv4"))
844 hints.ai_family = AF_INET;
845 else if (streq(family, "ipv6"))
846 hints.ai_family = AF_INET6;
851 r = getaddrinfo(host, port, &hints, &result);
855 return -EADDRNOTAVAIL;
857 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
858 b->sockaddr_size = result->ai_addrlen;
860 freeaddrinfo(result);
867 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
869 unsigned n_argv = 0, j;
871 size_t allocated = 0;
879 while (!IN_SET(**p, 0, ';')) {
880 r = parse_address_key(p, "guid", guid);
886 r = parse_address_key(p, "path", &path);
892 if (startswith(*p, "argv")) {
896 ul = strtoul(*p + 4, (char**) p, 10);
897 if (errno > 0 || **p != '=' || ul > 256) {
905 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
913 r = parse_address_key(p, NULL, argv + ul);
928 /* Make sure there are no holes in the array, with the
929 * exception of argv[0] */
930 for (j = 1; j < n_argv; j++)
936 if (argv && argv[0] == NULL) {
937 argv[0] = strdup(path);
952 for (j = 0; j < n_argv; j++)
960 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
961 _cleanup_free_ char *machine = NULL, *pid = NULL;
969 while (!IN_SET(**p, 0, ';')) {
970 r = parse_address_key(p, "guid", guid);
976 r = parse_address_key(p, "machine", &machine);
982 r = parse_address_key(p, "pid", &pid);
991 if (!machine == !pid)
995 if (!machine_name_is_valid(machine))
998 free_and_replace(b->machine, machine);
1000 b->machine = mfree(b->machine);
1004 r = parse_pid(pid, &b->nspid);
1010 b->sockaddr.un.sun_family = AF_UNIX;
1011 /* Note that we use the old /var/run prefix here, to increase compatibility with really old containers */
1012 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
1013 b->sockaddr_size = SOCKADDR_UN_LEN(b->sockaddr.un);
1014 b->is_local = false;
1019 static void bus_reset_parsed_address(sd_bus *b) {
1023 b->sockaddr_size = 0;
1024 b->exec_argv = strv_free(b->exec_argv);
1025 b->exec_path = mfree(b->exec_path);
1026 b->server_id = SD_ID128_NULL;
1027 b->machine = mfree(b->machine);
1031 static int bus_parse_next_address(sd_bus *b) {
1032 _cleanup_free_ char *guid = NULL;
1040 if (b->address[b->address_index] == 0)
1043 bus_reset_parsed_address(b);
1045 a = b->address + b->address_index;
1054 if (startswith(a, "unix:")) {
1057 r = parse_unix_address(b, &a, &guid);
1062 } else if (startswith(a, "tcp:")) {
1065 r = parse_tcp_address(b, &a, &guid);
1071 } else if (startswith(a, "unixexec:")) {
1074 r = parse_exec_address(b, &a, &guid);
1080 } else if (startswith(a, "x-machine-unix:")) {
1083 r = parse_container_unix_address(b, &a, &guid);
1096 r = sd_id128_from_string(guid, &b->server_id);
1101 b->address_index = a - b->address;
1105 static void bus_kill_exec(sd_bus *bus) {
1106 if (pid_is_valid(bus->busexec_pid) > 0) {
1107 sigterm_wait(bus->busexec_pid);
1108 bus->busexec_pid = 0;
1112 static int bus_start_address(sd_bus *b) {
1118 bus_close_io_fds(b);
1119 bus_close_inotify_fd(b);
1123 /* If you provide multiple different bus-addresses, we
1124 * try all of them in order and use the first one that
1128 r = bus_socket_exec(b);
1129 else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC)
1130 r = bus_container_connect_socket(b);
1131 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
1132 r = bus_socket_connect(b);
1139 q = bus_attach_io_events(b);
1143 q = bus_attach_inotify_event(b);
1150 b->last_connect_error = -r;
1153 r = bus_parse_next_address(b);
1157 return b->last_connect_error > 0 ? -b->last_connect_error : -ECONNREFUSED;
1161 int bus_next_address(sd_bus *b) {
1164 bus_reset_parsed_address(b);
1165 return bus_start_address(b);
1168 static int bus_start_fd(sd_bus *b) {
1173 assert(b->input_fd >= 0);
1174 assert(b->output_fd >= 0);
1176 r = fd_nonblock(b->input_fd, true);
1180 r = fd_cloexec(b->input_fd, true);
1184 if (b->input_fd != b->output_fd) {
1185 r = fd_nonblock(b->output_fd, true);
1189 r = fd_cloexec(b->output_fd, true);
1194 if (fstat(b->input_fd, &st) < 0)
1197 return bus_socket_take_fd(b);
1200 _public_ int sd_bus_start(sd_bus *bus) {
1203 assert_return(bus, -EINVAL);
1204 assert_return(bus = bus_resolve(bus), -ENOPKG);
1205 assert_return(bus->state == BUS_UNSET, -EPERM);
1206 assert_return(!bus_pid_changed(bus), -ECHILD);
1208 bus_set_state(bus, BUS_OPENING);
1210 if (bus->is_server && bus->bus_client)
1213 if (bus->input_fd >= 0)
1214 r = bus_start_fd(bus);
1215 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->machine)
1216 r = bus_start_address(bus);
1225 return bus_send_hello(bus);
1228 _public_ int sd_bus_open(sd_bus **ret) {
1233 assert_return(ret, -EINVAL);
1235 /* Let's connect to the starter bus if it is set, and
1236 * otherwise to the bus that is appropropriate for the scope
1237 * we are running in */
1239 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1241 if (streq(e, "system"))
1242 return sd_bus_open_system(ret);
1243 #if 0 /// elogind does not support systemd user instances
1244 else if (STR_IN_SET(e, "session", "user"))
1245 return sd_bus_open_user(ret);
1249 e = secure_getenv("DBUS_STARTER_ADDRESS");
1251 #if 0 /// elogind does not support systemd user instances
1252 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1253 return sd_bus_open_user(ret);
1256 return sd_bus_open_system(ret);
1263 r = sd_bus_set_address(b, e);
1267 b->bus_client = true;
1269 /* We don't know whether the bus is trusted or not, so better
1270 * be safe, and authenticate everything */
1272 b->is_local = false;
1273 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1275 r = sd_bus_start(b);
1287 int bus_set_address_system(sd_bus *b) {
1291 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1293 return sd_bus_set_address(b, e);
1295 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1298 _public_ int sd_bus_open_system(sd_bus **ret) {
1302 assert_return(ret, -EINVAL);
1308 r = bus_set_address_system(b);
1312 b->bus_client = true;
1313 b->is_system = true;
1315 /* Let's do per-method access control on the system bus. We
1316 * need the caller's UID and capability set for that. */
1318 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1321 r = sd_bus_start(b);
1333 #if 0 /// elogind can not open/use a user bus
1334 int bus_set_address_user(sd_bus *b) {
1336 _cleanup_free_ char *ee = NULL, *s = NULL;
1340 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1342 return sd_bus_set_address(b, e);
1344 e = secure_getenv("XDG_RUNTIME_DIR");
1348 ee = bus_address_escape(e);
1352 if (asprintf(&s, DEFAULT_USER_BUS_ADDRESS_FMT, ee) < 0)
1362 _public_ int sd_bus_open_user(sd_bus **ret) {
1363 #if 0 /// elogind does not support user buses
1367 assert_return(ret, -EINVAL);
1373 r = bus_set_address_user(b);
1377 b->bus_client = true;
1380 /* We don't do any per-method access control on the user
1385 r = sd_bus_start(b);
1396 return sd_bus_open_system(ret);
1400 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1401 _cleanup_free_ char *e = NULL;
1402 char *m = NULL, *c = NULL, *a;
1407 /* Let's see if we shall enter some container */
1408 m = strchr(host, ':');
1412 /* Let's make sure this is not a port of some kind,
1413 * and is a valid machine name. */
1414 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1417 /* Cut out the host part */
1418 t = strndupa(host, m - host - 1);
1419 e = bus_address_escape(t);
1423 c = strjoina(",argv5=--machine=", m);
1428 e = bus_address_escape(host);
1433 a = strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e, ",argv4=elogind-stdio-bridge", c);
1437 free_and_replace(b->address, a);
1442 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1446 assert_return(host, -EINVAL);
1447 assert_return(ret, -EINVAL);
1449 r = sd_bus_new(&bus);
1453 r = bus_set_address_system_remote(bus, host);
1457 bus->bus_client = true;
1458 bus->trusted = false;
1459 bus->is_system = true;
1460 bus->is_local = false;
1462 r = sd_bus_start(bus);
1474 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1475 _cleanup_free_ char *e = NULL;
1481 e = bus_address_escape(machine);
1485 a = strjoin("x-machine-unix:machine=", e);
1489 free_and_replace(b->address, a);
1494 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1498 assert_return(machine, -EINVAL);
1499 assert_return(ret, -EINVAL);
1500 assert_return(machine_name_is_valid(machine), -EINVAL);
1502 r = sd_bus_new(&bus);
1506 r = bus_set_address_system_machine(bus, machine);
1510 bus->bus_client = true;
1511 bus->trusted = false;
1512 bus->is_system = true;
1513 bus->is_local = false;
1515 r = sd_bus_start(bus);
1527 _public_ void sd_bus_close(sd_bus *bus) {
1531 if (bus->state == BUS_CLOSED)
1533 if (bus_pid_changed(bus))
1536 /* Don't leave ssh hanging around */
1539 bus_set_state(bus, BUS_CLOSED);
1541 sd_bus_detach_event(bus);
1543 /* Drop all queued messages so that they drop references to
1544 * the bus object and the bus may be freed */
1545 bus_reset_queues(bus);
1547 bus_close_io_fds(bus);
1548 bus_close_inotify_fd(bus);
1551 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1556 /* Have to do this before flush() to prevent hang */
1562 return sd_bus_unref(bus);
1565 void bus_enter_closing(sd_bus *bus) {
1568 if (!IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING, BUS_HELLO, BUS_RUNNING))
1571 bus_set_state(bus, BUS_CLOSING);
1574 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1579 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1584 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1590 i = REFCNT_DEC(bus->n_ref);
1598 _public_ int sd_bus_is_open(sd_bus *bus) {
1600 assert_return(bus, -EINVAL);
1601 assert_return(bus = bus_resolve(bus), -ENOPKG);
1602 assert_return(!bus_pid_changed(bus), -ECHILD);
1604 return BUS_IS_OPEN(bus->state);
1607 _public_ int sd_bus_is_ready(sd_bus *bus) {
1608 assert_return(bus, -EINVAL);
1609 assert_return(bus = bus_resolve(bus), -ENOPKG);
1610 assert_return(!bus_pid_changed(bus), -ECHILD);
1612 return bus->state == BUS_RUNNING;
1615 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1618 assert_return(bus, -EINVAL);
1619 assert_return(bus = bus_resolve(bus), -ENOPKG);
1620 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1621 assert_return(!bus_pid_changed(bus), -ECHILD);
1623 if (bus->is_monitor)
1626 if (type == SD_BUS_TYPE_UNIX_FD) {
1627 if (!bus->accept_fd)
1630 r = bus_ensure_running(bus);
1634 return bus->can_fds;
1637 return bus_type_is_valid(type);
1640 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1643 assert_return(bus, -EINVAL);
1644 assert_return(bus = bus_resolve(bus), -ENOPKG);
1645 assert_return(id, -EINVAL);
1646 assert_return(!bus_pid_changed(bus), -ECHILD);
1648 r = bus_ensure_running(bus);
1652 *id = bus->server_id;
1656 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1663 /* If we copy the same message to multiple
1664 * destinations, avoid using the same cookie
1666 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1671 timeout = BUS_DEFAULT_TIMEOUT;
1673 if (!m->sender && b->patch_sender) {
1674 r = sd_bus_message_set_sender(m, b->patch_sender);
1679 return sd_bus_message_seal(m, ++b->cookie, timeout);
1682 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1683 bool remarshal = false;
1687 /* wrong packet version */
1688 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1691 /* wrong packet endianness */
1692 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1695 return remarshal ? bus_message_remarshal(b, m) : 0;
1698 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1702 /* Fake some timestamps, if they were requested, and not
1703 * already initialized */
1704 if (b->attach_timestamp) {
1705 if (m->realtime <= 0)
1706 m->realtime = now(CLOCK_REALTIME);
1708 if (m->monotonic <= 0)
1709 m->monotonic = now(CLOCK_MONOTONIC);
1712 /* The bus specification says the serial number cannot be 0,
1713 * hence let's fill something in for synthetic messages. Since
1714 * synthetic messages might have a fake sender and we don't
1715 * want to interfere with the real sender's serial numbers we
1716 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1717 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1718 * even though kdbus can do 64bit. */
1719 return sd_bus_message_seal(m, 0xFFFFFFFFULL, 0);
1722 static int bus_write_message(sd_bus *bus, sd_bus_message *m, size_t *idx) {
1728 r = bus_socket_write_message(bus, m, idx);
1732 if (*idx >= BUS_MESSAGE_SIZE(m))
1733 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",
1734 bus_message_type_to_string(m->header->type),
1735 strna(sd_bus_message_get_sender(m)),
1736 strna(sd_bus_message_get_destination(m)),
1737 strna(sd_bus_message_get_path(m)),
1738 strna(sd_bus_message_get_interface(m)),
1739 strna(sd_bus_message_get_member(m)),
1740 BUS_MESSAGE_COOKIE(m),
1742 strna(m->root_container.signature),
1743 strna(m->error.name),
1744 strna(m->error.message));
1749 static int dispatch_wqueue(sd_bus *bus) {
1753 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1755 while (bus->wqueue_size > 0) {
1757 r = bus_write_message(bus, bus->wqueue[0], &bus->windex);
1761 /* Didn't do anything this time */
1763 else if (bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1764 /* Fully written. Let's drop the entry from
1767 * This isn't particularly optimized, but
1768 * well, this is supposed to be our worst-case
1769 * buffer only, and the socket buffer is
1770 * supposed to be our primary buffer, and if
1771 * it got full, then all bets are off
1775 sd_bus_message_unref(bus->wqueue[0]);
1776 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1786 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1789 return bus_socket_read_message(bus);
1792 int bus_rqueue_make_room(sd_bus *bus) {
1795 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1798 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1804 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1809 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1811 /* Note that the priority logic is only available on kdbus,
1812 * where the rqueue is unused. We check the rqueue here
1813 * anyway, because it's simple... */
1816 if (bus->rqueue_size > 0) {
1817 /* Dispatch a queued message */
1819 *m = bus->rqueue[0];
1821 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1825 /* Try to read a new message */
1826 r = bus_read_message(bus, hint_priority, priority);
1836 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie) {
1837 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1840 assert_return(m, -EINVAL);
1845 assert_return(!bus_pid_changed(bus), -ECHILD);
1847 if (!BUS_IS_OPEN(bus->state))
1851 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1858 /* If the cookie number isn't kept, then we know that no reply
1860 if (!cookie && !m->sealed)
1861 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1863 r = bus_seal_message(bus, m, 0);
1867 /* Remarshall if we have to. This will possibly unref the
1868 * message and place a replacement in m */
1869 r = bus_remarshal_message(bus, &m);
1873 /* If this is a reply and no reply was requested, then let's
1874 * suppress this, if we can */
1878 if (IN_SET(bus->state, BUS_RUNNING, BUS_HELLO) && bus->wqueue_size <= 0) {
1881 r = bus_write_message(bus, m, &idx);
1883 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
1884 bus_enter_closing(bus);
1891 if (idx < BUS_MESSAGE_SIZE(m)) {
1892 /* Wasn't fully written. So let's remember how
1893 * much was written. Note that the first entry
1894 * of the wqueue array is always allocated so
1895 * that we always can remember how much was
1897 bus->wqueue[0] = sd_bus_message_ref(m);
1898 bus->wqueue_size = 1;
1903 /* Just append it to the queue. */
1905 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1908 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1911 bus->wqueue[bus->wqueue_size++] = sd_bus_message_ref(m);
1916 *cookie = BUS_MESSAGE_COOKIE(m);
1921 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1924 assert_return(m, -EINVAL);
1929 assert_return(!bus_pid_changed(bus), -ECHILD);
1931 if (!BUS_IS_OPEN(bus->state))
1934 if (!streq_ptr(m->destination, destination)) {
1939 r = sd_bus_message_set_destination(m, destination);
1944 return sd_bus_send(bus, m, cookie);
1947 static usec_t calc_elapse(sd_bus *bus, uint64_t usec) {
1950 if (usec == (uint64_t) -1)
1953 /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
1954 * with any connection setup states. Hence, if a method callback is started earlier than that we just store the
1955 * relative timestamp, and afterwards the absolute one. */
1957 if (IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING))
1960 return now(CLOCK_MONOTONIC) + usec;
1963 static int timeout_compare(const void *a, const void *b) {
1964 const struct reply_callback *x = a, *y = b;
1966 if (x->timeout_usec != 0 && y->timeout_usec == 0)
1969 if (x->timeout_usec == 0 && y->timeout_usec != 0)
1972 if (x->timeout_usec < y->timeout_usec)
1975 if (x->timeout_usec > y->timeout_usec)
1981 _public_ int sd_bus_call_async(
1985 sd_bus_message_handler_t callback,
1989 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1990 _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *s = NULL;
1993 assert_return(m, -EINVAL);
1994 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1995 assert_return(!m->sealed || (!!callback == !(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)), -EINVAL);
2000 assert_return(!bus_pid_changed(bus), -ECHILD);
2002 if (!BUS_IS_OPEN(bus->state))
2005 /* If no callback is specified and there's no interest in a slot, then there's no reason to ask for a reply */
2006 if (!callback && !slot && !m->sealed)
2007 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
2009 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
2013 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
2017 r = bus_seal_message(bus, m, usec);
2021 r = bus_remarshal_message(bus, &m);
2025 if (slot || callback) {
2026 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
2030 s->reply_callback.callback = callback;
2032 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
2033 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
2035 s->reply_callback.cookie = 0;
2039 s->reply_callback.timeout_usec = calc_elapse(bus, m->timeout);
2040 if (s->reply_callback.timeout_usec != 0) {
2041 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
2043 s->reply_callback.timeout_usec = 0;
2049 r = sd_bus_send(bus, m, s ? &s->reply_callback.cookie : NULL);
2060 int bus_ensure_running(sd_bus *bus) {
2065 if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
2067 if (bus->state == BUS_RUNNING)
2071 r = sd_bus_process(bus, NULL);
2074 if (bus->state == BUS_RUNNING)
2079 r = sd_bus_wait(bus, (uint64_t) -1);
2085 _public_ int sd_bus_call(
2089 sd_bus_error *error,
2090 sd_bus_message **reply) {
2092 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
2098 bus_assert_return(m, -EINVAL, error);
2099 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
2100 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
2101 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
2106 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
2108 if (!BUS_IS_OPEN(bus->state)) {
2113 r = bus_ensure_running(bus);
2117 i = bus->rqueue_size;
2119 r = bus_seal_message(bus, m, usec);
2123 r = bus_remarshal_message(bus, &m);
2127 r = sd_bus_send(bus, m, &cookie);
2131 timeout = calc_elapse(bus, m->timeout);
2136 while (i < bus->rqueue_size) {
2137 sd_bus_message *incoming = NULL;
2139 incoming = bus->rqueue[i];
2141 if (incoming->reply_cookie == cookie) {
2142 /* Found a match! */
2144 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2146 log_debug_bus_message(incoming);
2148 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2150 if (incoming->n_fds <= 0 || bus->accept_fd) {
2154 sd_bus_message_unref(incoming);
2159 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2160 sd_bus_message_unref(incoming);
2163 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
2164 r = sd_bus_error_copy(error, &incoming->error);
2165 sd_bus_message_unref(incoming);
2172 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2175 streq(bus->unique_name, incoming->sender)) {
2177 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2180 /* Our own message? Somebody is trying
2181 * to send its own client a message,
2182 * let's not dead-lock, let's fail
2185 sd_bus_message_unref(incoming);
2190 /* Try to read more, right-away */
2194 r = bus_read_message(bus, false, 0);
2196 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2197 bus_enter_closing(bus);
2209 n = now(CLOCK_MONOTONIC);
2217 left = (uint64_t) -1;
2219 r = bus_poll(bus, true, left);
2227 r = dispatch_wqueue(bus);
2229 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2230 bus_enter_closing(bus);
2239 return sd_bus_error_set_errno(error, r);
2242 _public_ int sd_bus_get_fd(sd_bus *bus) {
2244 assert_return(bus, -EINVAL);
2245 assert_return(bus = bus_resolve(bus), -ENOPKG);
2246 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2247 assert_return(!bus_pid_changed(bus), -ECHILD);
2249 if (bus->state == BUS_CLOSED)
2252 if (bus->inotify_fd >= 0)
2253 return bus->inotify_fd;
2255 if (bus->input_fd >= 0)
2256 return bus->input_fd;
2261 _public_ int sd_bus_get_events(sd_bus *bus) {
2264 assert_return(bus, -EINVAL);
2265 assert_return(bus = bus_resolve(bus), -ENOPKG);
2266 assert_return(!bus_pid_changed(bus), -ECHILD);
2268 switch (bus->state) {
2274 case BUS_WATCH_BIND:
2282 case BUS_AUTHENTICATING:
2283 if (bus_socket_auth_needs_write(bus))
2291 if (bus->rqueue_size <= 0)
2293 if (bus->wqueue_size > 0)
2301 assert_not_reached("Unknown state");
2307 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2308 struct reply_callback *c;
2310 assert_return(bus, -EINVAL);
2311 assert_return(bus = bus_resolve(bus), -ENOPKG);
2312 assert_return(timeout_usec, -EINVAL);
2313 assert_return(!bus_pid_changed(bus), -ECHILD);
2315 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2318 if (bus->track_queue) {
2323 switch (bus->state) {
2325 case BUS_AUTHENTICATING:
2326 *timeout_usec = bus->auth_timeout;
2331 if (bus->rqueue_size > 0) {
2336 c = prioq_peek(bus->reply_callbacks_prioq);
2338 *timeout_usec = (uint64_t) -1;
2342 if (c->timeout_usec == 0) {
2343 *timeout_usec = (uint64_t) -1;
2347 *timeout_usec = c->timeout_usec;
2354 case BUS_WATCH_BIND:
2356 *timeout_usec = (uint64_t) -1;
2360 assert_not_reached("Unknown or unexpected stat");
2364 static int process_timeout(sd_bus *bus) {
2365 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2366 _cleanup_(sd_bus_message_unrefp) sd_bus_message* m = NULL;
2367 struct reply_callback *c;
2374 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2376 c = prioq_peek(bus->reply_callbacks_prioq);
2380 n = now(CLOCK_MONOTONIC);
2381 if (c->timeout_usec > n)
2384 r = bus_message_new_synthetic_error(
2387 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2392 r = bus_seal_synthetic_message(bus, m);
2396 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2397 c->timeout_usec = 0;
2399 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2402 slot = container_of(c, sd_bus_slot, reply_callback);
2404 bus->iteration_counter++;
2406 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2408 bus->current_message = m;
2409 bus->current_slot = sd_bus_slot_ref(slot);
2410 bus->current_handler = c->callback;
2411 bus->current_userdata = slot->userdata;
2412 r = c->callback(m, slot->userdata, &error_buffer);
2413 bus->current_userdata = NULL;
2414 bus->current_handler = NULL;
2415 bus->current_slot = NULL;
2416 bus->current_message = NULL;
2418 if (slot->floating) {
2419 bus_slot_disconnect(slot);
2420 sd_bus_slot_unref(slot);
2423 sd_bus_slot_unref(slot);
2425 /* When this is the hello message and it timed out, then make sure to propagate the error up, don't just log
2426 * and ignore the callback handler's return value. */
2430 return bus_maybe_reply_error(m, r, &error_buffer);
2433 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2437 if (bus->state != BUS_HELLO)
2440 /* Let's make sure the first message on the bus is the HELLO
2441 * reply. But note that we don't actually parse the message
2442 * here (we leave that to the usual handling), we just verify
2443 * we don't let any earlier msg through. */
2445 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2448 if (m->reply_cookie != 1)
2454 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2455 _cleanup_(sd_bus_message_unrefp) sd_bus_message *synthetic_reply = NULL;
2456 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2457 struct reply_callback *c;
2465 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2468 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2471 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2477 slot = container_of(c, sd_bus_slot, reply_callback);
2479 if (m->n_fds > 0 && !bus->accept_fd) {
2481 /* If the reply contained a file descriptor which we
2482 * didn't want we pass an error instead. */
2484 r = bus_message_new_synthetic_error(
2487 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2492 /* Copy over original timestamp */
2493 synthetic_reply->realtime = m->realtime;
2494 synthetic_reply->monotonic = m->monotonic;
2495 synthetic_reply->seqnum = m->seqnum;
2497 r = bus_seal_synthetic_message(bus, synthetic_reply);
2501 m = synthetic_reply;
2503 r = sd_bus_message_rewind(m, true);
2508 if (c->timeout_usec != 0) {
2509 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2510 c->timeout_usec = 0;
2513 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2515 bus->current_slot = sd_bus_slot_ref(slot);
2516 bus->current_handler = c->callback;
2517 bus->current_userdata = slot->userdata;
2518 r = c->callback(m, slot->userdata, &error_buffer);
2519 bus->current_userdata = NULL;
2520 bus->current_handler = NULL;
2521 bus->current_slot = NULL;
2523 if (slot->floating) {
2524 bus_slot_disconnect(slot);
2525 sd_bus_slot_unref(slot);
2528 sd_bus_slot_unref(slot);
2530 /* When this is the hello message and it failed, then make sure to propagate the error up, don't just log and
2531 * ignore the callback handler's return value. */
2535 return bus_maybe_reply_error(m, r, &error_buffer);
2538 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2539 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2540 struct filter_callback *l;
2547 bus->filter_callbacks_modified = false;
2549 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2552 if (bus->filter_callbacks_modified)
2555 /* Don't run this more than once per iteration */
2556 if (l->last_iteration == bus->iteration_counter)
2559 l->last_iteration = bus->iteration_counter;
2561 r = sd_bus_message_rewind(m, true);
2565 slot = container_of(l, sd_bus_slot, filter_callback);
2567 bus->current_slot = sd_bus_slot_ref(slot);
2568 bus->current_handler = l->callback;
2569 bus->current_userdata = slot->userdata;
2570 r = l->callback(m, slot->userdata, &error_buffer);
2571 bus->current_userdata = NULL;
2572 bus->current_handler = NULL;
2573 bus->current_slot = sd_bus_slot_unref(slot);
2575 r = bus_maybe_reply_error(m, r, &error_buffer);
2581 } while (bus->filter_callbacks_modified);
2586 static int process_match(sd_bus *bus, sd_bus_message *m) {
2593 bus->match_callbacks_modified = false;
2595 r = bus_match_run(bus, &bus->match_callbacks, m);
2599 } while (bus->match_callbacks_modified);
2604 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2605 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
2611 if (bus->is_monitor)
2614 if (bus->manual_peer_interface)
2617 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2620 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2623 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2626 if (streq_ptr(m->member, "Ping"))
2627 r = sd_bus_message_new_method_return(m, &reply);
2628 else if (streq_ptr(m->member, "GetMachineId")) {
2632 r = sd_id128_get_machine(&id);
2636 r = sd_bus_message_new_method_return(m, &reply);
2640 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2642 r = sd_bus_message_new_method_errorf(
2644 SD_BUS_ERROR_UNKNOWN_METHOD,
2645 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2651 r = sd_bus_send(bus, reply, NULL);
2658 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2662 /* If we got a message with a file descriptor which we didn't
2663 * want to accept, then let's drop it. How can this even
2664 * happen? For example, when the kernel queues a message into
2665 * an activatable names's queue which allows fds, and then is
2666 * delivered to us later even though we ourselves did not
2669 if (bus->is_monitor)
2678 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2679 return 1; /* just eat it up */
2681 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2684 static int process_message(sd_bus *bus, sd_bus_message *m) {
2690 bus->current_message = m;
2691 bus->iteration_counter++;
2693 log_debug_bus_message(m);
2695 r = process_hello(bus, m);
2699 r = process_reply(bus, m);
2703 r = process_fd_check(bus, m);
2707 r = process_filter(bus, m);
2711 r = process_match(bus, m);
2715 r = process_builtin(bus, m);
2719 r = bus_process_object(bus, m);
2722 bus->current_message = NULL;
2726 static int dispatch_track(sd_bus *bus) {
2729 if (!bus->track_queue)
2732 bus_track_dispatch(bus->track_queue);
2736 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2737 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2741 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2743 r = process_timeout(bus);
2747 r = dispatch_wqueue(bus);
2751 r = dispatch_track(bus);
2755 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2761 r = process_message(bus, m);
2766 r = sd_bus_message_rewind(m, true);
2775 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2777 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2778 strna(sd_bus_message_get_sender(m)),
2779 strna(sd_bus_message_get_path(m)),
2780 strna(sd_bus_message_get_interface(m)),
2781 strna(sd_bus_message_get_member(m)));
2783 r = sd_bus_reply_method_errorf(
2785 SD_BUS_ERROR_UNKNOWN_OBJECT,
2786 "Unknown object '%s'.", m->path);
2800 static int bus_exit_now(sd_bus *bus) {
2803 /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
2804 * sd_event_exit(), otherwise invokes libc exit(). */
2806 if (bus->exited) /* did we already exit? */
2808 if (!bus->exit_triggered) /* was the exit condition triggered? */
2810 if (!bus->exit_on_disconnect) /* Shall we actually exit on disconnection? */
2813 bus->exited = true; /* never exit more than once */
2815 log_debug("Bus connection disconnected, exiting.");
2818 return sd_event_exit(bus->event, EXIT_FAILURE);
2822 assert_not_reached("exit() didn't exit?");
2825 static int process_closing_reply_callback(sd_bus *bus, struct reply_callback *c) {
2826 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2827 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2834 r = bus_message_new_synthetic_error(
2837 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2842 r = bus_seal_synthetic_message(bus, m);
2846 if (c->timeout_usec != 0) {
2847 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2848 c->timeout_usec = 0;
2851 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2854 slot = container_of(c, sd_bus_slot, reply_callback);
2856 bus->iteration_counter++;
2858 bus->current_message = m;
2859 bus->current_slot = sd_bus_slot_ref(slot);
2860 bus->current_handler = c->callback;
2861 bus->current_userdata = slot->userdata;
2862 r = c->callback(m, slot->userdata, &error_buffer);
2863 bus->current_userdata = NULL;
2864 bus->current_handler = NULL;
2865 bus->current_slot = NULL;
2866 bus->current_message = NULL;
2868 if (slot->floating) {
2869 bus_slot_disconnect(slot);
2870 sd_bus_slot_unref(slot);
2873 sd_bus_slot_unref(slot);
2875 return bus_maybe_reply_error(m, r, &error_buffer);
2878 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2879 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2880 struct reply_callback *c;
2884 assert(bus->state == BUS_CLOSING);
2886 /* First, fail all outstanding method calls */
2887 c = ordered_hashmap_first(bus->reply_callbacks);
2889 return process_closing_reply_callback(bus, c);
2891 /* Then, fake-drop all remaining bus tracking references */
2893 bus_track_close(bus->tracks);
2897 /* Then, synthesize a Disconnected message */
2898 r = sd_bus_message_new_signal(
2901 "/org/freedesktop/DBus/Local",
2902 "org.freedesktop.DBus.Local",
2907 bus_message_set_sender_local(bus, m);
2909 r = bus_seal_synthetic_message(bus, m);
2915 bus->current_message = m;
2916 bus->iteration_counter++;
2918 r = process_filter(bus, m);
2922 r = process_match(bus, m);
2926 /* Nothing else to do, exit now, if the condition holds */
2927 bus->exit_triggered = true;
2928 (void) bus_exit_now(bus);
2938 bus->current_message = NULL;
2943 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2944 BUS_DONT_DESTROY(bus);
2947 /* Returns 0 when we didn't do anything. This should cause the
2948 * caller to invoke sd_bus_wait() before returning the next
2949 * time. Returns > 0 when we did something, which possibly
2950 * means *ret is filled in with an unprocessed message. */
2952 assert_return(bus, -EINVAL);
2953 assert_return(bus = bus_resolve(bus), -ENOPKG);
2954 assert_return(!bus_pid_changed(bus), -ECHILD);
2956 /* We don't allow recursively invoking sd_bus_process(). */
2957 assert_return(!bus->current_message, -EBUSY);
2958 assert(!bus->current_slot);
2960 switch (bus->state) {
2968 case BUS_WATCH_BIND:
2969 r = bus_socket_process_watch_bind(bus);
2973 r = bus_socket_process_opening(bus);
2976 case BUS_AUTHENTICATING:
2977 r = bus_socket_process_authenticating(bus);
2982 r = process_running(bus, hint_priority, priority, ret);
2986 /* This branch initializes *ret, hence we don't use the generic error checking below */
2990 return process_closing(bus, ret);
2993 assert_not_reached("Unknown state");
2996 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2997 bus_enter_closing(bus);
3008 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
3009 return bus_process_internal(bus, false, 0, ret);
3012 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
3013 return bus_process_internal(bus, true, priority, ret);
3016 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
3017 struct pollfd p[2] = {};
3020 usec_t m = USEC_INFINITY;
3024 if (bus->state == BUS_CLOSING)
3027 if (!BUS_IS_OPEN(bus->state))
3030 if (bus->state == BUS_WATCH_BIND) {
3031 assert(bus->inotify_fd >= 0);
3033 p[0].events = POLLIN;
3034 p[0].fd = bus->inotify_fd;
3039 e = sd_bus_get_events(bus);
3044 /* The caller really needs some more data, he doesn't
3045 * care about what's already read, or any timeouts
3046 * except its own. */
3050 /* The caller wants to process if there's something to
3051 * process, but doesn't care otherwise */
3053 r = sd_bus_get_timeout(bus, &until);
3057 m = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
3060 p[0].fd = bus->input_fd;
3061 if (bus->output_fd == bus->input_fd) {
3065 p[0].events = e & POLLIN;
3066 p[1].fd = bus->output_fd;
3067 p[1].events = e & POLLOUT;
3072 if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
3075 r = ppoll(p, n, m == USEC_INFINITY ? NULL : timespec_store(&ts, m), NULL);
3079 return r > 0 ? 1 : 0;
3082 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
3084 assert_return(bus, -EINVAL);
3085 assert_return(bus = bus_resolve(bus), -ENOPKG);
3086 assert_return(!bus_pid_changed(bus), -ECHILD);
3088 if (bus->state == BUS_CLOSING)
3091 if (!BUS_IS_OPEN(bus->state))
3094 if (bus->rqueue_size > 0)
3097 return bus_poll(bus, false, timeout_usec);
3100 _public_ int sd_bus_flush(sd_bus *bus) {
3103 assert_return(bus, -EINVAL);
3104 assert_return(bus = bus_resolve(bus), -ENOPKG);
3105 assert_return(!bus_pid_changed(bus), -ECHILD);
3107 if (bus->state == BUS_CLOSING)
3110 if (!BUS_IS_OPEN(bus->state))
3113 /* We never were connected? Don't hang in inotify for good, as there's no timeout set for it */
3114 if (bus->state == BUS_WATCH_BIND)
3117 r = bus_ensure_running(bus);
3121 if (bus->wqueue_size <= 0)
3125 r = dispatch_wqueue(bus);
3127 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
3128 bus_enter_closing(bus);
3135 if (bus->wqueue_size <= 0)
3138 r = bus_poll(bus, false, (uint64_t) -1);
3144 _public_ int sd_bus_add_filter(
3147 sd_bus_message_handler_t callback,
3152 assert_return(bus, -EINVAL);
3153 assert_return(bus = bus_resolve(bus), -ENOPKG);
3154 assert_return(callback, -EINVAL);
3155 assert_return(!bus_pid_changed(bus), -ECHILD);
3157 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
3161 s->filter_callback.callback = callback;
3163 bus->filter_callbacks_modified = true;
3164 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
3172 static int add_match_callback(
3175 sd_bus_error *ret_error) {
3177 sd_bus_slot *match_slot = userdata;
3178 bool failed = false;
3184 sd_bus_slot_ref(match_slot);
3186 if (sd_bus_message_is_method_error(m, NULL)) {
3187 log_debug_errno(sd_bus_message_get_errno(m),
3188 "Unable to add match %s, failing connection: %s",
3189 match_slot->match_callback.match_string,
3190 sd_bus_message_get_error(m)->message);
3194 log_debug("Match %s successfully installed.", match_slot->match_callback.match_string);
3196 if (match_slot->match_callback.install_callback) {
3199 bus = sd_bus_message_get_bus(m);
3201 /* This function has been called as slot handler, and we want to call another slot handler. Let's
3202 * update the slot callback metadata temporarily with our own data, and then revert back to the old
3205 assert(bus->current_slot == match_slot->match_callback.install_slot);
3206 assert(bus->current_handler == add_match_callback);
3207 assert(bus->current_userdata == userdata);
3209 bus->current_slot = match_slot;
3210 bus->current_handler = match_slot->match_callback.install_callback;
3211 bus->current_userdata = match_slot->userdata;
3213 r = match_slot->match_callback.install_callback(m, match_slot->userdata, ret_error);
3215 bus->current_slot = match_slot->match_callback.install_slot;
3216 bus->current_handler = add_match_callback;
3217 bus->current_userdata = userdata;
3219 match_slot->match_callback.install_slot = sd_bus_slot_unref(match_slot->match_callback.install_slot);
3221 if (failed) /* Generic failure handling: destroy the connection */
3222 bus_enter_closing(sd_bus_message_get_bus(m));
3227 if (failed && match_slot->floating) {
3228 bus_slot_disconnect(match_slot);
3229 sd_bus_slot_unref(match_slot);
3232 sd_bus_slot_unref(match_slot);
3237 static int bus_add_match_full(
3242 sd_bus_message_handler_t callback,
3243 sd_bus_message_handler_t install_callback,
3246 struct bus_match_component *components = NULL;
3247 unsigned n_components = 0;
3248 sd_bus_slot *s = NULL;
3251 assert_return(bus, -EINVAL);
3252 assert_return(bus = bus_resolve(bus), -ENOPKG);
3253 assert_return(match, -EINVAL);
3254 assert_return(!bus_pid_changed(bus), -ECHILD);
3256 r = bus_match_parse(match, &components, &n_components);
3260 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
3266 s->match_callback.callback = callback;
3267 s->match_callback.install_callback = install_callback;
3269 if (bus->bus_client) {
3270 enum bus_match_scope scope;
3272 scope = bus_match_get_scope(components, n_components);
3274 /* Do not install server-side matches for matches against the local service, interface or bus path. */
3275 if (scope != BUS_MATCH_LOCAL) {
3277 /* We store the original match string, so that we can use it to remove the match again. */
3279 s->match_callback.match_string = strdup(match);
3280 if (!s->match_callback.match_string) {
3286 r = bus_add_match_internal_async(bus,
3287 &s->match_callback.install_slot,
3288 s->match_callback.match_string,
3292 r = bus_add_match_internal(bus, s->match_callback.match_string);
3296 s->match_added = true;
3300 bus->match_callbacks_modified = true;
3301 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3310 bus_match_parse_free(components, n_components);
3311 sd_bus_slot_unref(s);
3316 #if 0 /// UNNEEDED by elogind
3318 _public_ int sd_bus_add_match(
3322 sd_bus_message_handler_t callback,
3325 return bus_add_match_full(bus, slot, false, match, callback, NULL, userdata);
3328 _public_ int sd_bus_add_match_async(
3332 sd_bus_message_handler_t callback,
3333 sd_bus_message_handler_t install_callback,
3336 return bus_add_match_full(bus, slot, true, match, callback, install_callback, userdata);
3339 bool bus_pid_changed(sd_bus *bus) {
3342 /* We don't support people creating a bus connection and
3343 * keeping it around over a fork(). Let's complain. */
3345 return bus->original_pid != getpid_cached();
3348 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3349 sd_bus *bus = userdata;
3354 /* Note that this is called both on input_fd, output_fd as well as inotify_fd events */
3356 r = sd_bus_process(bus, NULL);
3358 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3359 bus_enter_closing(bus);
3365 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3366 sd_bus *bus = userdata;
3371 r = sd_bus_process(bus, NULL);
3373 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3374 bus_enter_closing(bus);
3380 static int prepare_callback(sd_event_source *s, void *userdata) {
3381 sd_bus *bus = userdata;
3388 e = sd_bus_get_events(bus);
3394 if (bus->output_fd != bus->input_fd) {
3396 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3400 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3402 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3406 r = sd_bus_get_timeout(bus, &until);
3412 j = sd_event_source_set_time(bus->time_event_source, until);
3419 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3426 log_debug_errno(r, "Preparing of bus events failed, closing down: %m");
3427 bus_enter_closing(bus);
3432 static int quit_callback(sd_event_source *event, void *userdata) {
3433 sd_bus *bus = userdata;
3443 int bus_attach_io_events(sd_bus *bus) {
3448 if (bus->input_fd < 0)
3454 if (!bus->input_io_event_source) {
3455 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3459 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3463 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3467 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3469 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3474 if (bus->output_fd != bus->input_fd) {
3475 assert(bus->output_fd >= 0);
3477 if (!bus->output_io_event_source) {
3478 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3482 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3486 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3488 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3497 static void bus_detach_io_events(sd_bus *bus) {
3500 if (bus->input_io_event_source) {
3501 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3502 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3505 if (bus->output_io_event_source) {
3506 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3507 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3511 int bus_attach_inotify_event(sd_bus *bus) {
3516 if (bus->inotify_fd < 0)
3522 if (!bus->inotify_event_source) {
3523 r = sd_event_add_io(bus->event, &bus->inotify_event_source, bus->inotify_fd, EPOLLIN, io_callback, bus);
3527 r = sd_event_source_set_priority(bus->inotify_event_source, bus->event_priority);
3531 r = sd_event_source_set_description(bus->inotify_event_source, "bus-inotify");
3533 r = sd_event_source_set_io_fd(bus->inotify_event_source, bus->inotify_fd);
3540 static void bus_detach_inotify_event(sd_bus *bus) {
3543 if (bus->inotify_event_source) {
3544 sd_event_source_set_enabled(bus->inotify_event_source, SD_EVENT_OFF);
3545 bus->inotify_event_source = sd_event_source_unref(bus->inotify_event_source);
3549 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3552 assert_return(bus, -EINVAL);
3553 assert_return(bus = bus_resolve(bus), -ENOPKG);
3554 assert_return(!bus->event, -EBUSY);
3556 assert(!bus->input_io_event_source);
3557 assert(!bus->output_io_event_source);
3558 assert(!bus->time_event_source);
3561 bus->event = sd_event_ref(event);
3563 r = sd_event_default(&bus->event);
3568 bus->event_priority = priority;
3570 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3574 r = sd_event_source_set_priority(bus->time_event_source, priority);
3578 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3582 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3586 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3590 r = bus_attach_io_events(bus);
3594 r = bus_attach_inotify_event(bus);
3601 sd_bus_detach_event(bus);
3605 _public_ int sd_bus_detach_event(sd_bus *bus) {
3606 assert_return(bus, -EINVAL);
3607 assert_return(bus = bus_resolve(bus), -ENOPKG);
3612 bus_detach_io_events(bus);
3613 bus_detach_inotify_event(bus);
3615 if (bus->time_event_source) {
3616 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3617 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3620 if (bus->quit_event_source) {
3621 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3622 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3625 bus->event = sd_event_unref(bus->event);
3629 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3630 assert_return(bus, NULL);
3635 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3636 assert_return(bus, NULL);
3638 return bus->current_message;
3641 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3642 assert_return(bus, NULL);
3644 return bus->current_slot;
3647 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3648 assert_return(bus, NULL);
3650 return bus->current_handler;
3653 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3654 assert_return(bus, NULL);
3656 return bus->current_userdata;
3659 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3664 assert(default_bus);
3667 return !!*default_bus;
3670 *ret = sd_bus_ref(*default_bus);
3678 b->default_bus_ptr = default_bus;
3686 _public_ int sd_bus_default_system(sd_bus **ret) {
3687 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3691 _public_ int sd_bus_default_user(sd_bus **ret) {
3692 #if 0 /// elogind does not support user buses
3693 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3695 return sd_bus_default_system(ret);
3699 _public_ int sd_bus_default(sd_bus **ret) {
3700 int (*bus_open)(sd_bus **) = NULL;
3703 #if 0 /// elogind does not support systemd units
3706 #if 0 /// elogind does not support systemd user instances
3708 busp = bus_choose_default(&bus_open);
3709 return bus_default(bus_open, busp, ret);
3712 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3713 assert_return(b, -EINVAL);
3714 assert_return(tid, -EINVAL);
3715 assert_return(!bus_pid_changed(b), -ECHILD);
3723 return sd_event_get_tid(b->event, tid);
3728 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3729 _cleanup_free_ char *e = NULL;
3732 assert_return(object_path_is_valid(prefix), -EINVAL);
3733 assert_return(external_id, -EINVAL);
3734 assert_return(ret_path, -EINVAL);
3736 e = bus_label_escape(external_id);
3740 ret = strjoin(prefix, "/", e);
3748 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3752 assert_return(object_path_is_valid(path), -EINVAL);
3753 assert_return(object_path_is_valid(prefix), -EINVAL);
3754 assert_return(external_id, -EINVAL);
3756 e = object_path_startswith(path, prefix);
3758 *external_id = NULL;
3762 ret = bus_label_unescape(e);
3770 _public_ int sd_bus_path_encode_many(char **out, const char *path_template, ...) {
3771 _cleanup_strv_free_ char **labels = NULL;
3772 char *path, *path_pos, **label_pos;
3773 const char *sep, *template_pos;
3778 assert_return(out, -EINVAL);
3779 assert_return(path_template, -EINVAL);
3781 path_length = strlen(path_template);
3783 va_start(list, path_template);
3784 for (sep = strchr(path_template, '%'); sep; sep = strchr(sep + 1, '%')) {
3788 arg = va_arg(list, const char *);
3794 label = bus_label_escape(arg);
3800 r = strv_consume(&labels, label);
3806 /* add label length, but account for the format character */
3807 path_length += strlen(label) - 1;
3811 path = malloc(path_length + 1);
3818 for (template_pos = path_template; *template_pos; ) {
3819 sep = strchrnul(template_pos, '%');
3820 path_pos = mempcpy(path_pos, template_pos, sep - template_pos);
3824 path_pos = stpcpy(path_pos, *label_pos++);
3825 template_pos = sep + 1;
3833 _public_ int sd_bus_path_decode_many(const char *path, const char *path_template, ...) {
3834 _cleanup_strv_free_ char **labels = NULL;
3835 const char *template_pos, *path_pos;
3841 * This decodes an object-path based on a template argument. The
3842 * template consists of a verbatim path, optionally including special
3845 * - Each occurrence of '%' in the template matches an arbitrary
3846 * substring of a label in the given path. At most one such
3847 * directive is allowed per label. For each such directive, the
3848 * caller must provide an output parameter (char **) via va_arg. If
3849 * NULL is passed, the given label is verified, but not returned.
3850 * For each matched label, the *decoded* label is stored in the
3851 * passed output argument, and the caller is responsible to free
3852 * it. Note that the output arguments are only modified if the
3853 * actualy path matched the template. Otherwise, they're left
3856 * This function returns <0 on error, 0 if the path does not match the
3857 * template, 1 if it matched.
3860 assert_return(path, -EINVAL);
3861 assert_return(path_template, -EINVAL);
3865 for (template_pos = path_template; *template_pos; ) {
3870 /* verify everything until the next '%' matches verbatim */
3871 sep = strchrnul(template_pos, '%');
3872 length = sep - template_pos;
3873 if (strncmp(path_pos, template_pos, length))
3877 template_pos += length;
3882 /* We found the next '%' character. Everything up until here
3883 * matched. We now skip ahead to the end of this label and make
3884 * sure it matches the tail of the label in the path. Then we
3885 * decode the string in-between and save it for later use. */
3887 ++template_pos; /* skip over '%' */
3889 sep = strchrnul(template_pos, '/');
3890 length = sep - template_pos; /* length of suffix to match verbatim */
3892 /* verify the suffixes match */
3893 sep = strchrnul(path_pos, '/');
3894 if (sep - path_pos < (ssize_t)length ||
3895 strncmp(sep - length, template_pos, length))
3898 template_pos += length; /* skip over matched label */
3899 length = sep - path_pos - length; /* length of sub-label to decode */
3901 /* store unescaped label for later use */
3902 label = bus_label_unescape_n(path_pos, length);
3906 r = strv_consume(&labels, label);
3910 path_pos = sep; /* skip decoded label and suffix */
3913 /* end of template must match end of path */
3917 /* copy the labels over to the caller */
3918 va_start(list, path_template);
3919 for (label_pos = labels; label_pos && *label_pos; ++label_pos) {
3922 arg = va_arg(list, char **);
3930 labels = mfree(labels);
3934 _public_ int sd_bus_try_close(sd_bus *bus) {
3935 assert_return(bus, -EINVAL);
3936 assert_return(bus = bus_resolve(bus), -ENOPKG);
3937 assert_return(!bus_pid_changed(bus), -ECHILD);
3942 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3943 assert_return(bus, -EINVAL);
3944 assert_return(bus = bus_resolve(bus), -ENOPKG);
3945 assert_return(description, -EINVAL);
3946 assert_return(bus->description, -ENXIO);
3947 assert_return(!bus_pid_changed(bus), -ECHILD);
3949 if (bus->description)
3950 *description = bus->description;
3951 else if (bus->is_system)
3952 *description = "system";
3953 else if (bus->is_user)
3954 *description = "user";
3956 *description = NULL;
3961 int bus_get_root_path(sd_bus *bus) {
3964 if (bus->cgroup_root)
3967 r = cg_get_root_path(&bus->cgroup_root);
3969 bus->cgroup_root = strdup("/");
3970 if (!bus->cgroup_root)
3979 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3980 assert_return(bus, -EINVAL);
3981 assert_return(bus = bus_resolve(bus), -ENOPKG);
3982 assert_return(scope, -EINVAL);
3983 assert_return(!bus_pid_changed(bus), -ECHILD);
3990 if (bus->is_system) {
3998 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
4000 assert_return(bus, -EINVAL);
4001 assert_return(bus = bus_resolve(bus), -ENOPKG);
4002 assert_return(address, -EINVAL);
4003 assert_return(!bus_pid_changed(bus), -ECHILD);
4006 *address = bus->address;
4013 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
4014 assert_return(bus, -EINVAL);
4015 assert_return(bus = bus_resolve(bus), -ENOPKG);
4016 assert_return(mask, -EINVAL);
4017 assert_return(!bus_pid_changed(bus), -ECHILD);
4019 *mask = bus->creds_mask;
4023 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
4024 assert_return(bus, -EINVAL);
4025 assert_return(bus = bus_resolve(bus), -ENOPKG);
4026 assert_return(!bus_pid_changed(bus), -ECHILD);
4028 return bus->bus_client;
4031 _public_ int sd_bus_is_server(sd_bus *bus) {
4032 assert_return(bus, -EINVAL);
4033 assert_return(bus = bus_resolve(bus), -ENOPKG);
4034 assert_return(!bus_pid_changed(bus), -ECHILD);
4036 return bus->is_server;
4039 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
4040 assert_return(bus, -EINVAL);
4041 assert_return(bus = bus_resolve(bus), -ENOPKG);
4042 assert_return(!bus_pid_changed(bus), -ECHILD);
4044 return bus->anonymous_auth;
4047 _public_ int sd_bus_is_trusted(sd_bus *bus) {
4048 assert_return(bus, -EINVAL);
4049 assert_return(bus = bus_resolve(bus), -ENOPKG);
4050 assert_return(!bus_pid_changed(bus), -ECHILD);
4052 return bus->trusted;
4055 _public_ int sd_bus_is_monitor(sd_bus *bus) {
4056 assert_return(bus, -EINVAL);
4057 assert_return(bus = bus_resolve(bus), -ENOPKG);
4058 assert_return(!bus_pid_changed(bus), -ECHILD);
4060 return bus->is_monitor;
4063 static void flush_close(sd_bus *bus) {
4067 /* Flushes and closes the specified bus. We take a ref before,
4068 * to ensure the flushing does not cause the bus to be
4071 sd_bus_flush_close_unref(sd_bus_ref(bus));
4074 _public_ void sd_bus_default_flush_close(void) {
4075 flush_close(default_starter_bus);
4076 #if 0 /// elogind does not support user buses
4077 flush_close(default_user_bus);
4079 flush_close(default_system_bus);
4082 _public_ int sd_bus_set_exit_on_disconnect(sd_bus *bus, int b) {
4083 assert_return(bus, -EINVAL);
4084 assert_return(bus = bus_resolve(bus), -ENOPKG);
4086 /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
4087 * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
4088 * from the client side. */
4089 bus->exit_on_disconnect = b;
4091 /* If the exit condition was triggered already, exit immediately. */
4092 return bus_exit_now(bus);
4095 _public_ int sd_bus_get_exit_on_disconnect(sd_bus *bus) {
4096 assert_return(bus, -EINVAL);
4097 assert_return(bus = bus_resolve(bus), -ENOPKG);
4099 return bus->exit_on_disconnect;
4102 _public_ int sd_bus_set_sender(sd_bus *bus, const char *sender) {
4103 assert_return(bus, -EINVAL);
4104 assert_return(bus = bus_resolve(bus), -ENOPKG);
4105 assert_return(!bus->bus_client, -EPERM);
4106 assert_return(!sender || service_name_is_valid(sender), -EINVAL);
4108 return free_and_strdup(&bus->patch_sender, sender);
4111 _public_ int sd_bus_get_sender(sd_bus *bus, const char **ret) {
4112 assert_return(bus, -EINVAL);
4113 assert_return(bus = bus_resolve(bus), -ENOPKG);
4114 assert_return(ret, -EINVAL);
4116 if (!bus->patch_sender)
4119 *ret = bus->patch_sender;
4123 _public_ int sd_bus_get_n_queued_read(sd_bus *bus, uint64_t *ret) {
4124 assert_return(bus, -EINVAL);
4125 assert_return(bus = bus_resolve(bus), -ENOPKG);
4126 assert_return(!bus_pid_changed(bus), -ECHILD);
4127 assert_return(ret, -EINVAL);
4129 *ret = bus->rqueue_size;
4133 _public_ int sd_bus_get_n_queued_write(sd_bus *bus, uint64_t *ret) {
4134 assert_return(bus, -EINVAL);
4135 assert_return(bus = bus_resolve(bus), -ENOPKG);
4136 assert_return(!bus_pid_changed(bus), -ECHILD);
4137 assert_return(ret, -EINVAL);
4139 *ret = bus->wqueue_size;