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 static thread_local sd_bus *default_user_bus = NULL;
86 static thread_local sd_bus *default_starter_bus = NULL;
88 static sd_bus **bus_choose_default(int (**bus_open)(sd_bus **)) {
91 /* Let's try our best to reuse another cached connection. If
92 * the starter bus type is set, connect via our normal
93 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
94 * we can share the connection with the user/system default
97 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
99 if (streq(e, "system")) {
101 *bus_open = sd_bus_open_system;
102 return &default_system_bus;
103 } else if (STR_IN_SET(e, "user", "session")) {
105 *bus_open = sd_bus_open_user;
106 return &default_user_bus;
110 /* No type is specified, so we have not other option than to
111 * use the starter address if it is set. */
112 e = secure_getenv("DBUS_STARTER_ADDRESS");
115 *bus_open = sd_bus_open;
116 return &default_starter_bus;
119 /* Finally, if nothing is set use the cached connection for
122 if (cg_pid_get_owner_uid(0, NULL) >= 0) {
124 *bus_open = sd_bus_open_user;
125 return &default_user_bus;
128 *bus_open = sd_bus_open_system;
129 return &default_system_bus;
133 sd_bus *bus_resolve(sd_bus *bus) {
134 switch ((uintptr_t) bus) {
135 case (uintptr_t) SD_BUS_DEFAULT:
136 return *(bus_choose_default(NULL));
137 case (uintptr_t) SD_BUS_DEFAULT_USER:
138 return default_user_bus;
139 case (uintptr_t) SD_BUS_DEFAULT_SYSTEM:
140 return default_system_bus;
146 void bus_close_io_fds(sd_bus *b) {
149 bus_detach_io_events(b);
151 if (b->input_fd != b->output_fd)
152 safe_close(b->output_fd);
153 b->output_fd = b->input_fd = safe_close(b->input_fd);
156 void bus_close_inotify_fd(sd_bus *b) {
159 bus_detach_inotify_event(b);
161 b->inotify_fd = safe_close(b->inotify_fd);
162 b->inotify_watches = mfree(b->inotify_watches);
163 b->n_inotify_watches = 0;
166 static void bus_reset_queues(sd_bus *b) {
169 while (b->rqueue_size > 0)
170 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
172 b->rqueue = mfree(b->rqueue);
173 b->rqueue_allocated = 0;
175 while (b->wqueue_size > 0)
176 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
178 b->wqueue = mfree(b->wqueue);
179 b->wqueue_allocated = 0;
182 static void bus_free(sd_bus *b) {
186 assert(!b->track_queue);
189 b->state = BUS_CLOSED;
191 sd_bus_detach_event(b);
193 while ((s = b->slots)) {
194 /* At this point only floating slots can still be
195 * around, because the non-floating ones keep a
196 * reference to the bus, and we thus couldn't be
197 * destructing right now... We forcibly disconnect the
198 * slots here, so that they still can be referenced by
199 * apps, but are dead. */
202 bus_slot_disconnect(s);
203 sd_bus_slot_unref(s);
206 if (b->default_bus_ptr)
207 *b->default_bus_ptr = NULL;
210 bus_close_inotify_fd(b);
215 free(b->unique_name);
216 free(b->auth_buffer);
219 free(b->cgroup_root);
220 free(b->description);
221 free(b->patch_sender);
224 strv_free(b->exec_argv);
226 close_many(b->fds, b->n_fds);
231 ordered_hashmap_free_free(b->reply_callbacks);
232 prioq_free(b->reply_callbacks_prioq);
234 assert(b->match_callbacks.type == BUS_MATCH_ROOT);
235 bus_match_free(&b->match_callbacks);
237 hashmap_free_free(b->vtable_methods);
238 hashmap_free_free(b->vtable_properties);
240 assert(hashmap_isempty(b->nodes));
241 hashmap_free(b->nodes);
245 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
250 _public_ int sd_bus_new(sd_bus **ret) {
253 assert_return(ret, -EINVAL);
259 r->n_ref = REFCNT_INIT;
260 r->input_fd = r->output_fd = -1;
262 r->message_version = 1;
263 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
265 r->original_pid = getpid_cached();
266 r->n_groups = (size_t) -1;
268 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
270 /* We guarantee that wqueue always has space for at least one
272 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
281 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
284 assert_return(bus, -EINVAL);
285 assert_return(bus = bus_resolve(bus), -ENOPKG);
286 assert_return(bus->state == BUS_UNSET, -EPERM);
287 assert_return(address, -EINVAL);
288 assert_return(!bus_pid_changed(bus), -ECHILD);
294 free_and_replace(bus->address, a);
299 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
300 assert_return(bus, -EINVAL);
301 assert_return(bus = bus_resolve(bus), -ENOPKG);
302 assert_return(bus->state == BUS_UNSET, -EPERM);
303 assert_return(input_fd >= 0, -EBADF);
304 assert_return(output_fd >= 0, -EBADF);
305 assert_return(!bus_pid_changed(bus), -ECHILD);
307 bus->input_fd = input_fd;
308 bus->output_fd = output_fd;
312 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
315 assert_return(bus, -EINVAL);
316 assert_return(bus = bus_resolve(bus), -ENOPKG);
317 assert_return(bus->state == BUS_UNSET, -EPERM);
318 assert_return(path, -EINVAL);
319 assert_return(!strv_isempty(argv), -EINVAL);
320 assert_return(!bus_pid_changed(bus), -ECHILD);
332 free_and_replace(bus->exec_path, p);
334 strv_free(bus->exec_argv);
340 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
341 assert_return(bus, -EINVAL);
342 assert_return(bus = bus_resolve(bus), -ENOPKG);
343 assert_return(bus->state == BUS_UNSET, -EPERM);
344 assert_return(!bus->patch_sender, -EPERM);
345 assert_return(!bus_pid_changed(bus), -ECHILD);
347 bus->bus_client = !!b;
351 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
352 assert_return(bus, -EINVAL);
353 assert_return(bus = bus_resolve(bus), -ENOPKG);
354 assert_return(bus->state == BUS_UNSET, -EPERM);
355 assert_return(!bus_pid_changed(bus), -ECHILD);
357 bus->is_monitor = !!b;
361 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
362 assert_return(bus, -EINVAL);
363 assert_return(bus = bus_resolve(bus), -ENOPKG);
364 assert_return(bus->state == BUS_UNSET, -EPERM);
365 assert_return(!bus_pid_changed(bus), -ECHILD);
367 bus->accept_fd = !!b;
371 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
372 assert_return(bus, -EINVAL);
373 assert_return(bus = bus_resolve(bus), -ENOPKG);
374 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
375 assert_return(!bus_pid_changed(bus), -ECHILD);
377 /* This is not actually supported by any of our transports these days, but we do honour it for synthetic
378 * replies, and maybe one day classic D-Bus learns this too */
379 bus->attach_timestamp = !!b;
384 _public_ int sd_bus_negotiate_creds(sd_bus *bus, int b, uint64_t mask) {
385 assert_return(bus, -EINVAL);
386 assert_return(bus = bus_resolve(bus), -ENOPKG);
387 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
388 assert_return(!IN_SET(bus->state, BUS_CLOSING, BUS_CLOSED), -EPERM);
389 assert_return(!bus_pid_changed(bus), -ECHILD);
391 SET_FLAG(bus->creds_mask, mask, b);
393 /* The well knowns we need unconditionally, so that matches can work */
394 bus->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
399 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
400 assert_return(bus, -EINVAL);
401 assert_return(bus = bus_resolve(bus), -ENOPKG);
402 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
403 assert_return(bus->state == BUS_UNSET, -EPERM);
404 assert_return(!bus_pid_changed(bus), -ECHILD);
406 bus->is_server = !!b;
407 bus->server_id = server_id;
411 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
412 assert_return(bus, -EINVAL);
413 assert_return(bus = bus_resolve(bus), -ENOPKG);
414 assert_return(bus->state == BUS_UNSET, -EPERM);
415 assert_return(!bus_pid_changed(bus), -ECHILD);
417 bus->anonymous_auth = !!b;
421 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
422 assert_return(bus, -EINVAL);
423 assert_return(bus = bus_resolve(bus), -ENOPKG);
424 assert_return(bus->state == BUS_UNSET, -EPERM);
425 assert_return(!bus_pid_changed(bus), -ECHILD);
431 _public_ int sd_bus_set_description(sd_bus *bus, const char *description) {
432 assert_return(bus, -EINVAL);
433 assert_return(bus = bus_resolve(bus), -ENOPKG);
434 assert_return(bus->state == BUS_UNSET, -EPERM);
435 assert_return(!bus_pid_changed(bus), -ECHILD);
437 return free_and_strdup(&bus->description, description);
440 _public_ int sd_bus_set_allow_interactive_authorization(sd_bus *bus, int b) {
441 assert_return(bus, -EINVAL);
442 assert_return(bus = bus_resolve(bus), -ENOPKG);
443 assert_return(!bus_pid_changed(bus), -ECHILD);
445 bus->allow_interactive_authorization = !!b;
449 _public_ int sd_bus_get_allow_interactive_authorization(sd_bus *bus) {
450 assert_return(bus, -EINVAL);
451 assert_return(bus = bus_resolve(bus), -ENOPKG);
452 assert_return(!bus_pid_changed(bus), -ECHILD);
454 return bus->allow_interactive_authorization;
457 _public_ int sd_bus_set_watch_bind(sd_bus *bus, int b) {
458 assert_return(bus, -EINVAL);
459 assert_return(bus = bus_resolve(bus), -ENOPKG);
460 assert_return(bus->state == BUS_UNSET, -EPERM);
461 assert_return(!bus_pid_changed(bus), -ECHILD);
463 bus->watch_bind = !!b;
467 _public_ int sd_bus_get_watch_bind(sd_bus *bus) {
468 assert_return(bus, -EINVAL);
469 assert_return(bus = bus_resolve(bus), -ENOPKG);
470 assert_return(!bus_pid_changed(bus), -ECHILD);
472 return bus->watch_bind;
475 _public_ int sd_bus_set_connected_signal(sd_bus *bus, int b) {
476 assert_return(bus, -EINVAL);
477 assert_return(bus = bus_resolve(bus), -ENOPKG);
478 assert_return(bus->state == BUS_UNSET, -EPERM);
479 assert_return(!bus_pid_changed(bus), -ECHILD);
481 bus->connected_signal = !!b;
485 _public_ int sd_bus_get_connected_signal(sd_bus *bus) {
486 assert_return(bus, -EINVAL);
487 assert_return(bus = bus_resolve(bus), -ENOPKG);
488 assert_return(!bus_pid_changed(bus), -ECHILD);
490 return bus->connected_signal;
493 static int synthesize_connected_signal(sd_bus *bus) {
494 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
499 /* If enabled, synthesizes a local "Connected" signal mirroring the local "Disconnected" signal. This is called
500 * whenever we fully established a connection, i.e. after the authorization phase, and after receiving the
501 * Hello() reply. Or in other words, whenver we enter BUS_RUNNING state.
503 * This is useful so that clients can start doing stuff whenver the connection is fully established in a way
504 * that works independently from whether we connected to a full bus or just a direct connection. */
506 if (!bus->connected_signal)
509 r = sd_bus_message_new_signal(
512 "/org/freedesktop/DBus/Local",
513 "org.freedesktop.DBus.Local",
518 bus_message_set_sender_local(bus, m);
520 r = bus_seal_synthetic_message(bus, m);
524 r = bus_rqueue_make_room(bus);
528 /* Insert at the very front */
529 memmove(bus->rqueue + 1, bus->rqueue, sizeof(sd_bus_message*) * bus->rqueue_size);
530 bus->rqueue[0] = TAKE_PTR(m);
536 void bus_set_state(sd_bus *bus, enum bus_state state) {
538 static const char * const table[_BUS_STATE_MAX] = {
539 [BUS_UNSET] = "UNSET",
540 [BUS_WATCH_BIND] = "WATCH_BIND",
541 [BUS_OPENING] = "OPENING",
542 [BUS_AUTHENTICATING] = "AUTHENTICATING",
543 [BUS_HELLO] = "HELLO",
544 [BUS_RUNNING] = "RUNNING",
545 [BUS_CLOSING] = "CLOSING",
546 [BUS_CLOSED] = "CLOSED",
550 assert(state < _BUS_STATE_MAX);
552 if (state == bus->state)
555 log_debug("Bus %s: changing state %s → %s", strna(bus->description), table[bus->state], table[state]);
559 static int hello_callback(sd_bus_message *reply, void *userdata, sd_bus_error *error) {
568 assert(IN_SET(bus->state, BUS_HELLO, BUS_CLOSING));
570 r = sd_bus_message_get_errno(reply);
574 r = sd_bus_message_read(reply, "s", &s);
578 if (!service_name_is_valid(s) || s[0] != ':')
585 free_and_replace(bus->unique_name, t);
587 if (bus->state == BUS_HELLO) {
588 bus_set_state(bus, BUS_RUNNING);
590 r = synthesize_connected_signal(bus);
598 static int bus_send_hello(sd_bus *bus) {
599 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
604 if (!bus->bus_client)
607 r = sd_bus_message_new_method_call(
610 "org.freedesktop.DBus",
611 "/org/freedesktop/DBus",
612 "org.freedesktop.DBus",
617 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
620 int bus_start_running(sd_bus *bus) {
621 struct reply_callback *c;
627 assert(bus->state < BUS_HELLO);
629 /* We start all method call timeouts when we enter BUS_HELLO or BUS_RUNNING mode. At this point let's convert
630 * all relative to absolute timestamps. Note that we do not reshuffle the reply callback priority queue since
631 * adding a fixed value to all entries should not alter the internal order. */
633 n = now(CLOCK_MONOTONIC);
634 ORDERED_HASHMAP_FOREACH(c, bus->reply_callbacks, i) {
635 if (c->timeout_usec == 0)
638 c->timeout_usec = usec_add(n, c->timeout_usec);
641 if (bus->bus_client) {
642 bus_set_state(bus, BUS_HELLO);
646 bus_set_state(bus, BUS_RUNNING);
648 r = synthesize_connected_signal(bus);
655 static int parse_address_key(const char **p, const char *key, char **value) {
656 size_t l, n = 0, allocated = 0;
657 _cleanup_free_ char *r = NULL;
666 if (strncmp(*p, key, l) != 0)
679 while (!IN_SET(*a, ';', ',', 0)) {
693 c = (char) ((x << 4) | y);
700 if (!GREEDY_REALLOC(r, allocated, n + 2))
718 free_and_replace(*value, r);
723 static void skip_address_key(const char **p) {
727 *p += strcspn(*p, ",");
733 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
734 _cleanup_free_ char *path = NULL, *abstract = NULL;
743 while (!IN_SET(**p, 0, ';')) {
744 r = parse_address_key(p, "guid", guid);
750 r = parse_address_key(p, "path", &path);
756 r = parse_address_key(p, "abstract", &abstract);
765 if (!path && !abstract)
768 if (path && abstract)
773 if (l > sizeof(b->sockaddr.un.sun_path))
776 b->sockaddr.un.sun_family = AF_UNIX;
777 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
778 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
779 } else if (abstract) {
780 l = strlen(abstract);
781 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
784 b->sockaddr.un.sun_family = AF_UNIX;
785 b->sockaddr.un.sun_path[0] = 0;
786 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
787 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
795 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
796 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
798 struct addrinfo *result, hints = {
799 .ai_socktype = SOCK_STREAM,
800 .ai_flags = AI_ADDRCONFIG,
808 while (!IN_SET(**p, 0, ';')) {
809 r = parse_address_key(p, "guid", guid);
815 r = parse_address_key(p, "host", &host);
821 r = parse_address_key(p, "port", &port);
827 r = parse_address_key(p, "family", &family);
840 if (streq(family, "ipv4"))
841 hints.ai_family = AF_INET;
842 else if (streq(family, "ipv6"))
843 hints.ai_family = AF_INET6;
848 r = getaddrinfo(host, port, &hints, &result);
852 return -EADDRNOTAVAIL;
854 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
855 b->sockaddr_size = result->ai_addrlen;
857 freeaddrinfo(result);
864 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
866 unsigned n_argv = 0, j;
868 size_t allocated = 0;
876 while (!IN_SET(**p, 0, ';')) {
877 r = parse_address_key(p, "guid", guid);
883 r = parse_address_key(p, "path", &path);
889 if (startswith(*p, "argv")) {
893 ul = strtoul(*p + 4, (char**) p, 10);
894 if (errno > 0 || **p != '=' || ul > 256) {
902 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
910 r = parse_address_key(p, NULL, argv + ul);
925 /* Make sure there are no holes in the array, with the
926 * exception of argv[0] */
927 for (j = 1; j < n_argv; j++)
933 if (argv && argv[0] == NULL) {
934 argv[0] = strdup(path);
949 for (j = 0; j < n_argv; j++)
957 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
958 _cleanup_free_ char *machine = NULL, *pid = NULL;
966 while (!IN_SET(**p, 0, ';')) {
967 r = parse_address_key(p, "guid", guid);
973 r = parse_address_key(p, "machine", &machine);
979 r = parse_address_key(p, "pid", &pid);
988 if (!machine == !pid)
992 if (!machine_name_is_valid(machine))
995 free_and_replace(b->machine, machine);
997 b->machine = mfree(b->machine);
1001 r = parse_pid(pid, &b->nspid);
1007 b->sockaddr.un.sun_family = AF_UNIX;
1008 /* Note that we use the old /var/run prefix here, to increase compatibility with really old containers */
1009 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
1010 b->sockaddr_size = SOCKADDR_UN_LEN(b->sockaddr.un);
1011 b->is_local = false;
1016 static void bus_reset_parsed_address(sd_bus *b) {
1020 b->sockaddr_size = 0;
1021 b->exec_argv = strv_free(b->exec_argv);
1022 b->exec_path = mfree(b->exec_path);
1023 b->server_id = SD_ID128_NULL;
1024 b->machine = mfree(b->machine);
1028 static int bus_parse_next_address(sd_bus *b) {
1029 _cleanup_free_ char *guid = NULL;
1037 if (b->address[b->address_index] == 0)
1040 bus_reset_parsed_address(b);
1042 a = b->address + b->address_index;
1051 if (startswith(a, "unix:")) {
1054 r = parse_unix_address(b, &a, &guid);
1059 } else if (startswith(a, "tcp:")) {
1062 r = parse_tcp_address(b, &a, &guid);
1068 } else if (startswith(a, "unixexec:")) {
1071 r = parse_exec_address(b, &a, &guid);
1077 } else if (startswith(a, "x-machine-unix:")) {
1080 r = parse_container_unix_address(b, &a, &guid);
1093 r = sd_id128_from_string(guid, &b->server_id);
1098 b->address_index = a - b->address;
1102 static void bus_kill_exec(sd_bus *bus) {
1103 if (pid_is_valid(bus->busexec_pid) > 0) {
1104 sigterm_wait(bus->busexec_pid);
1105 bus->busexec_pid = 0;
1109 static int bus_start_address(sd_bus *b) {
1115 bus_close_io_fds(b);
1116 bus_close_inotify_fd(b);
1120 /* If you provide multiple different bus-addresses, we
1121 * try all of them in order and use the first one that
1125 r = bus_socket_exec(b);
1126 else if ((b->nspid > 0 || b->machine) && b->sockaddr.sa.sa_family != AF_UNSPEC)
1127 r = bus_container_connect_socket(b);
1128 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
1129 r = bus_socket_connect(b);
1136 q = bus_attach_io_events(b);
1140 q = bus_attach_inotify_event(b);
1147 b->last_connect_error = -r;
1150 r = bus_parse_next_address(b);
1154 return b->last_connect_error > 0 ? -b->last_connect_error : -ECONNREFUSED;
1158 int bus_next_address(sd_bus *b) {
1161 bus_reset_parsed_address(b);
1162 return bus_start_address(b);
1165 static int bus_start_fd(sd_bus *b) {
1170 assert(b->input_fd >= 0);
1171 assert(b->output_fd >= 0);
1173 r = fd_nonblock(b->input_fd, true);
1177 r = fd_cloexec(b->input_fd, true);
1181 if (b->input_fd != b->output_fd) {
1182 r = fd_nonblock(b->output_fd, true);
1186 r = fd_cloexec(b->output_fd, true);
1191 if (fstat(b->input_fd, &st) < 0)
1194 return bus_socket_take_fd(b);
1197 _public_ int sd_bus_start(sd_bus *bus) {
1200 assert_return(bus, -EINVAL);
1201 assert_return(bus = bus_resolve(bus), -ENOPKG);
1202 assert_return(bus->state == BUS_UNSET, -EPERM);
1203 assert_return(!bus_pid_changed(bus), -ECHILD);
1205 bus_set_state(bus, BUS_OPENING);
1207 if (bus->is_server && bus->bus_client)
1210 if (bus->input_fd >= 0)
1211 r = bus_start_fd(bus);
1212 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->machine)
1213 r = bus_start_address(bus);
1222 return bus_send_hello(bus);
1225 _public_ int sd_bus_open_with_description(sd_bus **ret, const char *description) {
1230 assert_return(ret, -EINVAL);
1232 /* Let's connect to the starter bus if it is set, and
1233 * otherwise to the bus that is appropropriate for the scope
1234 * we are running in */
1236 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1238 if (streq(e, "system"))
1239 return sd_bus_open_system_with_description(ret, description);
1240 #if 0 /// elogind does not support systemd user instances
1241 else if (STR_IN_SET(e, "session", "user"))
1243 return sd_bus_open_user_with_description(ret, description);
1246 e = secure_getenv("DBUS_STARTER_ADDRESS");
1248 #if 0 /// elogind does not support systemd user instances
1249 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1250 return sd_bus_open_user_with_description(ret, description);
1253 return sd_bus_open_system_with_description(ret, description);
1260 r = sd_bus_set_address(b, e);
1264 b->bus_client = true;
1266 /* We don't know whether the bus is trusted or not, so better
1267 * be safe, and authenticate everything */
1269 b->is_local = false;
1270 b->creds_mask |= SD_BUS_CREDS_UID | SD_BUS_CREDS_EUID | SD_BUS_CREDS_EFFECTIVE_CAPS;
1272 r = sd_bus_start(b);
1284 _public_ int sd_bus_open(sd_bus **ret) {
1285 return sd_bus_open_with_description(ret, NULL);
1288 int bus_set_address_system(sd_bus *b) {
1292 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1294 return sd_bus_set_address(b, e);
1296 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_ADDRESS);
1299 _public_ int sd_bus_open_system_with_description(sd_bus **ret, const char *description) {
1303 assert_return(ret, -EINVAL);
1310 r = sd_bus_set_description(b, description);
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 _public_ int sd_bus_open_system(sd_bus **ret) {
1341 return sd_bus_open_system_with_description(ret, NULL);
1344 #if 0 /// elogind can not open/use a user bus
1345 int bus_set_address_user(sd_bus *b) {
1347 _cleanup_free_ char *ee = NULL, *s = NULL;
1351 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1353 return sd_bus_set_address(b, e);
1355 e = secure_getenv("XDG_RUNTIME_DIR");
1359 ee = bus_address_escape(e);
1363 if (asprintf(&s, DEFAULT_USER_BUS_ADDRESS_FMT, ee) < 0)
1366 b->address = TAKE_PTR(s);
1372 _public_ int sd_bus_open_user_with_description(sd_bus **ret, const char *description) {
1373 #if 0 /// elogind does not support user buses
1377 assert_return(ret, -EINVAL);
1384 r = sd_bus_set_description(b, description);
1389 r = bus_set_address_user(b);
1393 b->bus_client = true;
1396 /* We don't do any per-method access control on the user
1401 r = sd_bus_start(b);
1413 _public_ int sd_bus_open_user(sd_bus **ret) {
1414 return sd_bus_open_user_with_description(ret, NULL);
1416 return sd_bus_open_system(ret);
1420 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1421 _cleanup_free_ char *e = NULL;
1422 char *m = NULL, *c = NULL, *a;
1427 /* Let's see if we shall enter some container */
1428 m = strchr(host, ':');
1432 /* Let's make sure this is not a port of some kind,
1433 * and is a valid machine name. */
1434 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1437 /* Cut out the host part */
1438 t = strndupa(host, m - host - 1);
1439 e = bus_address_escape(t);
1443 c = strjoina(",argv5=--machine=", m);
1448 e = bus_address_escape(host);
1453 a = strjoin("unixexec:path=ssh,argv1=-xT,argv2=--,argv3=", e, ",argv4=elogind-stdio-bridge", c);
1457 free_and_replace(b->address, a);
1462 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1466 assert_return(host, -EINVAL);
1467 assert_return(ret, -EINVAL);
1469 r = sd_bus_new(&bus);
1473 r = bus_set_address_system_remote(bus, host);
1477 bus->bus_client = true;
1478 bus->trusted = false;
1479 bus->is_system = true;
1480 bus->is_local = false;
1482 r = sd_bus_start(bus);
1494 int bus_set_address_system_machine(sd_bus *b, const char *machine) {
1495 _cleanup_free_ char *e = NULL;
1501 e = bus_address_escape(machine);
1505 a = strjoin("x-machine-unix:machine=", e);
1509 free_and_replace(b->address, a);
1514 _public_ int sd_bus_open_system_machine(sd_bus **ret, const char *machine) {
1518 assert_return(machine, -EINVAL);
1519 assert_return(ret, -EINVAL);
1520 assert_return(machine_name_is_valid(machine), -EINVAL);
1522 r = sd_bus_new(&bus);
1526 r = bus_set_address_system_machine(bus, machine);
1530 bus->bus_client = true;
1531 bus->trusted = false;
1532 bus->is_system = true;
1533 bus->is_local = false;
1535 r = sd_bus_start(bus);
1547 _public_ void sd_bus_close(sd_bus *bus) {
1551 if (bus->state == BUS_CLOSED)
1553 if (bus_pid_changed(bus))
1556 /* Don't leave ssh hanging around */
1559 bus_set_state(bus, BUS_CLOSED);
1561 sd_bus_detach_event(bus);
1563 /* Drop all queued messages so that they drop references to
1564 * the bus object and the bus may be freed */
1565 bus_reset_queues(bus);
1567 bus_close_io_fds(bus);
1568 bus_close_inotify_fd(bus);
1571 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
1576 /* Have to do this before flush() to prevent hang */
1582 return sd_bus_unref(bus);
1585 void bus_enter_closing(sd_bus *bus) {
1588 if (!IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING, BUS_HELLO, BUS_RUNNING))
1591 bus_set_state(bus, BUS_CLOSING);
1594 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1599 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1604 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1610 i = REFCNT_DEC(bus->n_ref);
1618 _public_ int sd_bus_is_open(sd_bus *bus) {
1620 assert_return(bus, -EINVAL);
1621 assert_return(bus = bus_resolve(bus), -ENOPKG);
1622 assert_return(!bus_pid_changed(bus), -ECHILD);
1624 return BUS_IS_OPEN(bus->state);
1627 _public_ int sd_bus_is_ready(sd_bus *bus) {
1628 assert_return(bus, -EINVAL);
1629 assert_return(bus = bus_resolve(bus), -ENOPKG);
1630 assert_return(!bus_pid_changed(bus), -ECHILD);
1632 return bus->state == BUS_RUNNING;
1635 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1638 assert_return(bus, -EINVAL);
1639 assert_return(bus = bus_resolve(bus), -ENOPKG);
1640 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1641 assert_return(!bus_pid_changed(bus), -ECHILD);
1643 if (bus->is_monitor)
1646 if (type == SD_BUS_TYPE_UNIX_FD) {
1647 if (!bus->accept_fd)
1650 r = bus_ensure_running(bus);
1654 return bus->can_fds;
1657 return bus_type_is_valid(type);
1660 _public_ int sd_bus_get_bus_id(sd_bus *bus, sd_id128_t *id) {
1663 assert_return(bus, -EINVAL);
1664 assert_return(bus = bus_resolve(bus), -ENOPKG);
1665 assert_return(id, -EINVAL);
1666 assert_return(!bus_pid_changed(bus), -ECHILD);
1668 r = bus_ensure_running(bus);
1672 *id = bus->server_id;
1676 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1683 /* If we copy the same message to multiple
1684 * destinations, avoid using the same cookie
1686 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1691 timeout = BUS_DEFAULT_TIMEOUT;
1693 if (!m->sender && b->patch_sender) {
1694 r = sd_bus_message_set_sender(m, b->patch_sender);
1699 return sd_bus_message_seal(m, ++b->cookie, timeout);
1702 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1703 bool remarshal = false;
1707 /* wrong packet version */
1708 if (b->message_version != 0 && b->message_version != (*m)->header->version)
1711 /* wrong packet endianness */
1712 if (b->message_endian != 0 && b->message_endian != (*m)->header->endian)
1715 return remarshal ? bus_message_remarshal(b, m) : 0;
1718 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1722 /* Fake some timestamps, if they were requested, and not
1723 * already initialized */
1724 if (b->attach_timestamp) {
1725 if (m->realtime <= 0)
1726 m->realtime = now(CLOCK_REALTIME);
1728 if (m->monotonic <= 0)
1729 m->monotonic = now(CLOCK_MONOTONIC);
1732 /* The bus specification says the serial number cannot be 0,
1733 * hence let's fill something in for synthetic messages. Since
1734 * synthetic messages might have a fake sender and we don't
1735 * want to interfere with the real sender's serial numbers we
1736 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1737 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1738 * even though kdbus can do 64bit. */
1739 return sd_bus_message_seal(m, 0xFFFFFFFFULL, 0);
1742 static int bus_write_message(sd_bus *bus, sd_bus_message *m, size_t *idx) {
1748 r = bus_socket_write_message(bus, m, idx);
1752 if (*idx >= BUS_MESSAGE_SIZE(m))
1753 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",
1754 bus_message_type_to_string(m->header->type),
1755 strna(sd_bus_message_get_sender(m)),
1756 strna(sd_bus_message_get_destination(m)),
1757 strna(sd_bus_message_get_path(m)),
1758 strna(sd_bus_message_get_interface(m)),
1759 strna(sd_bus_message_get_member(m)),
1760 BUS_MESSAGE_COOKIE(m),
1762 strna(m->root_container.signature),
1763 strna(m->error.name),
1764 strna(m->error.message));
1769 static int dispatch_wqueue(sd_bus *bus) {
1773 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1775 while (bus->wqueue_size > 0) {
1777 r = bus_write_message(bus, bus->wqueue[0], &bus->windex);
1781 /* Didn't do anything this time */
1783 else if (bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1784 /* Fully written. Let's drop the entry from
1787 * This isn't particularly optimized, but
1788 * well, this is supposed to be our worst-case
1789 * buffer only, and the socket buffer is
1790 * supposed to be our primary buffer, and if
1791 * it got full, then all bets are off
1795 sd_bus_message_unref(bus->wqueue[0]);
1796 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1806 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1809 return bus_socket_read_message(bus);
1812 int bus_rqueue_make_room(sd_bus *bus) {
1815 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1818 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1824 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1829 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
1831 /* Note that the priority logic is only available on kdbus,
1832 * where the rqueue is unused. We check the rqueue here
1833 * anyway, because it's simple... */
1836 if (bus->rqueue_size > 0) {
1837 /* Dispatch a queued message */
1839 *m = bus->rqueue[0];
1841 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1845 /* Try to read a new message */
1846 r = bus_read_message(bus, hint_priority, priority);
1856 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie) {
1857 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
1860 assert_return(m, -EINVAL);
1865 assert_return(!bus_pid_changed(bus), -ECHILD);
1867 if (!BUS_IS_OPEN(bus->state))
1871 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1878 /* If the cookie number isn't kept, then we know that no reply
1880 if (!cookie && !m->sealed)
1881 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1883 r = bus_seal_message(bus, m, 0);
1887 /* Remarshall if we have to. This will possibly unref the
1888 * message and place a replacement in m */
1889 r = bus_remarshal_message(bus, &m);
1893 /* If this is a reply and no reply was requested, then let's
1894 * suppress this, if we can */
1898 if (IN_SET(bus->state, BUS_RUNNING, BUS_HELLO) && bus->wqueue_size <= 0) {
1901 r = bus_write_message(bus, m, &idx);
1903 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
1904 bus_enter_closing(bus);
1911 if (idx < BUS_MESSAGE_SIZE(m)) {
1912 /* Wasn't fully written. So let's remember how
1913 * much was written. Note that the first entry
1914 * of the wqueue array is always allocated so
1915 * that we always can remember how much was
1917 bus->wqueue[0] = sd_bus_message_ref(m);
1918 bus->wqueue_size = 1;
1923 /* Just append it to the queue. */
1925 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1928 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1931 bus->wqueue[bus->wqueue_size++] = sd_bus_message_ref(m);
1936 *cookie = BUS_MESSAGE_COOKIE(m);
1941 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1944 assert_return(m, -EINVAL);
1949 assert_return(!bus_pid_changed(bus), -ECHILD);
1951 if (!BUS_IS_OPEN(bus->state))
1954 if (!streq_ptr(m->destination, destination)) {
1959 r = sd_bus_message_set_destination(m, destination);
1964 return sd_bus_send(bus, m, cookie);
1967 static usec_t calc_elapse(sd_bus *bus, uint64_t usec) {
1970 if (usec == (uint64_t) -1)
1973 /* We start all timeouts the instant we enter BUS_HELLO/BUS_RUNNING state, so that the don't run in parallel
1974 * with any connection setup states. Hence, if a method callback is started earlier than that we just store the
1975 * relative timestamp, and afterwards the absolute one. */
1977 if (IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING))
1980 return now(CLOCK_MONOTONIC) + usec;
1983 static int timeout_compare(const void *a, const void *b) {
1984 const struct reply_callback *x = a, *y = b;
1986 if (x->timeout_usec != 0 && y->timeout_usec == 0)
1989 if (x->timeout_usec == 0 && y->timeout_usec != 0)
1992 if (x->timeout_usec < y->timeout_usec)
1995 if (x->timeout_usec > y->timeout_usec)
2001 _public_ int sd_bus_call_async(
2005 sd_bus_message_handler_t callback,
2009 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
2010 _cleanup_(sd_bus_slot_unrefp) sd_bus_slot *s = NULL;
2013 assert_return(m, -EINVAL);
2014 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
2015 assert_return(!m->sealed || (!!callback == !(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)), -EINVAL);
2020 assert_return(!bus_pid_changed(bus), -ECHILD);
2022 if (!BUS_IS_OPEN(bus->state))
2025 /* If no callback is specified and there's no interest in a slot, then there's no reason to ask for a reply */
2026 if (!callback && !slot && !m->sealed)
2027 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
2029 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
2033 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
2037 r = bus_seal_message(bus, m, usec);
2041 r = bus_remarshal_message(bus, &m);
2045 if (slot || callback) {
2046 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
2050 s->reply_callback.callback = callback;
2052 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
2053 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
2055 s->reply_callback.cookie = 0;
2059 s->reply_callback.timeout_usec = calc_elapse(bus, m->timeout);
2060 if (s->reply_callback.timeout_usec != 0) {
2061 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
2063 s->reply_callback.timeout_usec = 0;
2069 r = sd_bus_send(bus, m, s ? &s->reply_callback.cookie : NULL);
2080 int bus_ensure_running(sd_bus *bus) {
2085 if (IN_SET(bus->state, BUS_UNSET, BUS_CLOSED, BUS_CLOSING))
2087 if (bus->state == BUS_RUNNING)
2091 r = sd_bus_process(bus, NULL);
2094 if (bus->state == BUS_RUNNING)
2099 r = sd_bus_wait(bus, (uint64_t) -1);
2105 _public_ int sd_bus_call(
2109 sd_bus_error *error,
2110 sd_bus_message **reply) {
2112 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = sd_bus_message_ref(_m);
2118 bus_assert_return(m, -EINVAL, error);
2119 bus_assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL, error);
2120 bus_assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL, error);
2121 bus_assert_return(!bus_error_is_dirty(error), -EINVAL, error);
2126 bus_assert_return(!bus_pid_changed(bus), -ECHILD, error);
2128 if (!BUS_IS_OPEN(bus->state)) {
2133 r = bus_ensure_running(bus);
2137 i = bus->rqueue_size;
2139 r = bus_seal_message(bus, m, usec);
2143 r = bus_remarshal_message(bus, &m);
2147 r = sd_bus_send(bus, m, &cookie);
2151 timeout = calc_elapse(bus, m->timeout);
2156 while (i < bus->rqueue_size) {
2157 sd_bus_message *incoming = NULL;
2159 incoming = bus->rqueue[i];
2161 if (incoming->reply_cookie == cookie) {
2162 /* Found a match! */
2164 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2166 log_debug_bus_message(incoming);
2168 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
2170 if (incoming->n_fds <= 0 || bus->accept_fd) {
2174 sd_bus_message_unref(incoming);
2179 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
2180 sd_bus_message_unref(incoming);
2183 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR) {
2184 r = sd_bus_error_copy(error, &incoming->error);
2185 sd_bus_message_unref(incoming);
2192 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
2195 streq(bus->unique_name, incoming->sender)) {
2197 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
2200 /* Our own message? Somebody is trying
2201 * to send its own client a message,
2202 * let's not dead-lock, let's fail
2205 sd_bus_message_unref(incoming);
2210 /* Try to read more, right-away */
2214 r = bus_read_message(bus, false, 0);
2216 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2217 bus_enter_closing(bus);
2229 n = now(CLOCK_MONOTONIC);
2237 left = (uint64_t) -1;
2239 r = bus_poll(bus, true, left);
2247 r = dispatch_wqueue(bus);
2249 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
2250 bus_enter_closing(bus);
2259 return sd_bus_error_set_errno(error, r);
2262 _public_ int sd_bus_get_fd(sd_bus *bus) {
2264 assert_return(bus, -EINVAL);
2265 assert_return(bus = bus_resolve(bus), -ENOPKG);
2266 assert_return(bus->input_fd == bus->output_fd, -EPERM);
2267 assert_return(!bus_pid_changed(bus), -ECHILD);
2269 if (bus->state == BUS_CLOSED)
2272 if (bus->inotify_fd >= 0)
2273 return bus->inotify_fd;
2275 if (bus->input_fd >= 0)
2276 return bus->input_fd;
2281 _public_ int sd_bus_get_events(sd_bus *bus) {
2284 assert_return(bus, -EINVAL);
2285 assert_return(bus = bus_resolve(bus), -ENOPKG);
2286 assert_return(!bus_pid_changed(bus), -ECHILD);
2288 switch (bus->state) {
2294 case BUS_WATCH_BIND:
2302 case BUS_AUTHENTICATING:
2303 if (bus_socket_auth_needs_write(bus))
2311 if (bus->rqueue_size <= 0)
2313 if (bus->wqueue_size > 0)
2321 assert_not_reached("Unknown state");
2327 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2328 struct reply_callback *c;
2330 assert_return(bus, -EINVAL);
2331 assert_return(bus = bus_resolve(bus), -ENOPKG);
2332 assert_return(timeout_usec, -EINVAL);
2333 assert_return(!bus_pid_changed(bus), -ECHILD);
2335 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2338 if (bus->track_queue) {
2343 switch (bus->state) {
2345 case BUS_AUTHENTICATING:
2346 *timeout_usec = bus->auth_timeout;
2351 if (bus->rqueue_size > 0) {
2356 c = prioq_peek(bus->reply_callbacks_prioq);
2358 *timeout_usec = (uint64_t) -1;
2362 if (c->timeout_usec == 0) {
2363 *timeout_usec = (uint64_t) -1;
2367 *timeout_usec = c->timeout_usec;
2374 case BUS_WATCH_BIND:
2376 *timeout_usec = (uint64_t) -1;
2380 assert_not_reached("Unknown or unexpected stat");
2384 static int process_timeout(sd_bus *bus) {
2385 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2386 _cleanup_(sd_bus_message_unrefp) sd_bus_message* m = NULL;
2387 struct reply_callback *c;
2394 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2396 c = prioq_peek(bus->reply_callbacks_prioq);
2400 n = now(CLOCK_MONOTONIC);
2401 if (c->timeout_usec > n)
2404 r = bus_message_new_synthetic_error(
2407 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2412 r = bus_seal_synthetic_message(bus, m);
2416 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2417 c->timeout_usec = 0;
2419 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2422 slot = container_of(c, sd_bus_slot, reply_callback);
2424 bus->iteration_counter++;
2426 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2428 bus->current_message = m;
2429 bus->current_slot = sd_bus_slot_ref(slot);
2430 bus->current_handler = c->callback;
2431 bus->current_userdata = slot->userdata;
2432 r = c->callback(m, slot->userdata, &error_buffer);
2433 bus->current_userdata = NULL;
2434 bus->current_handler = NULL;
2435 bus->current_slot = NULL;
2436 bus->current_message = NULL;
2438 if (slot->floating) {
2439 bus_slot_disconnect(slot);
2440 sd_bus_slot_unref(slot);
2443 sd_bus_slot_unref(slot);
2445 /* When this is the hello message and it timed out, then make sure to propagate the error up, don't just log
2446 * and ignore the callback handler's return value. */
2450 return bus_maybe_reply_error(m, r, &error_buffer);
2453 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2457 if (bus->state != BUS_HELLO)
2460 /* Let's make sure the first message on the bus is the HELLO
2461 * reply. But note that we don't actually parse the message
2462 * here (we leave that to the usual handling), we just verify
2463 * we don't let any earlier msg through. */
2465 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2468 if (m->reply_cookie != 1)
2474 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2475 _cleanup_(sd_bus_message_unrefp) sd_bus_message *synthetic_reply = NULL;
2476 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2477 struct reply_callback *c;
2485 if (!IN_SET(m->header->type, SD_BUS_MESSAGE_METHOD_RETURN, SD_BUS_MESSAGE_METHOD_ERROR))
2488 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2491 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2497 slot = container_of(c, sd_bus_slot, reply_callback);
2499 if (m->n_fds > 0 && !bus->accept_fd) {
2501 /* If the reply contained a file descriptor which we
2502 * didn't want we pass an error instead. */
2504 r = bus_message_new_synthetic_error(
2507 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2512 /* Copy over original timestamp */
2513 synthetic_reply->realtime = m->realtime;
2514 synthetic_reply->monotonic = m->monotonic;
2515 synthetic_reply->seqnum = m->seqnum;
2517 r = bus_seal_synthetic_message(bus, synthetic_reply);
2521 m = synthetic_reply;
2523 r = sd_bus_message_rewind(m, true);
2528 if (c->timeout_usec != 0) {
2529 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2530 c->timeout_usec = 0;
2533 is_hello = bus->state == BUS_HELLO && c->callback == hello_callback;
2535 bus->current_slot = sd_bus_slot_ref(slot);
2536 bus->current_handler = c->callback;
2537 bus->current_userdata = slot->userdata;
2538 r = c->callback(m, slot->userdata, &error_buffer);
2539 bus->current_userdata = NULL;
2540 bus->current_handler = NULL;
2541 bus->current_slot = NULL;
2543 if (slot->floating) {
2544 bus_slot_disconnect(slot);
2545 sd_bus_slot_unref(slot);
2548 sd_bus_slot_unref(slot);
2550 /* When this is the hello message and it failed, then make sure to propagate the error up, don't just log and
2551 * ignore the callback handler's return value. */
2555 return bus_maybe_reply_error(m, r, &error_buffer);
2558 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2559 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2560 struct filter_callback *l;
2567 bus->filter_callbacks_modified = false;
2569 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2572 if (bus->filter_callbacks_modified)
2575 /* Don't run this more than once per iteration */
2576 if (l->last_iteration == bus->iteration_counter)
2579 l->last_iteration = bus->iteration_counter;
2581 r = sd_bus_message_rewind(m, true);
2585 slot = container_of(l, sd_bus_slot, filter_callback);
2587 bus->current_slot = sd_bus_slot_ref(slot);
2588 bus->current_handler = l->callback;
2589 bus->current_userdata = slot->userdata;
2590 r = l->callback(m, slot->userdata, &error_buffer);
2591 bus->current_userdata = NULL;
2592 bus->current_handler = NULL;
2593 bus->current_slot = sd_bus_slot_unref(slot);
2595 r = bus_maybe_reply_error(m, r, &error_buffer);
2601 } while (bus->filter_callbacks_modified);
2606 static int process_match(sd_bus *bus, sd_bus_message *m) {
2613 bus->match_callbacks_modified = false;
2615 r = bus_match_run(bus, &bus->match_callbacks, m);
2619 } while (bus->match_callbacks_modified);
2624 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2625 _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
2631 if (bus->is_monitor)
2634 if (bus->manual_peer_interface)
2637 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2640 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2643 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2646 if (streq_ptr(m->member, "Ping"))
2647 r = sd_bus_message_new_method_return(m, &reply);
2648 else if (streq_ptr(m->member, "GetMachineId")) {
2652 r = sd_id128_get_machine(&id);
2656 r = sd_bus_message_new_method_return(m, &reply);
2660 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2662 r = sd_bus_message_new_method_errorf(
2664 SD_BUS_ERROR_UNKNOWN_METHOD,
2665 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2671 r = sd_bus_send(bus, reply, NULL);
2678 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2682 /* If we got a message with a file descriptor which we didn't
2683 * want to accept, then let's drop it. How can this even
2684 * happen? For example, when the kernel queues a message into
2685 * an activatable names's queue which allows fds, and then is
2686 * delivered to us later even though we ourselves did not
2689 if (bus->is_monitor)
2698 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2699 return 1; /* just eat it up */
2701 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2704 static int process_message(sd_bus *bus, sd_bus_message *m) {
2710 bus->current_message = m;
2711 bus->iteration_counter++;
2713 log_debug_bus_message(m);
2715 r = process_hello(bus, m);
2719 r = process_reply(bus, m);
2723 r = process_fd_check(bus, m);
2727 r = process_filter(bus, m);
2731 r = process_match(bus, m);
2735 r = process_builtin(bus, m);
2739 r = bus_process_object(bus, m);
2742 bus->current_message = NULL;
2746 static int dispatch_track(sd_bus *bus) {
2749 if (!bus->track_queue)
2752 bus_track_dispatch(bus->track_queue);
2756 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2757 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2761 assert(IN_SET(bus->state, BUS_RUNNING, BUS_HELLO));
2763 r = process_timeout(bus);
2767 r = dispatch_wqueue(bus);
2771 r = dispatch_track(bus);
2775 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2781 r = process_message(bus, m);
2786 r = sd_bus_message_rewind(m, true);
2795 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2797 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2798 strna(sd_bus_message_get_sender(m)),
2799 strna(sd_bus_message_get_path(m)),
2800 strna(sd_bus_message_get_interface(m)),
2801 strna(sd_bus_message_get_member(m)));
2803 r = sd_bus_reply_method_errorf(
2805 SD_BUS_ERROR_UNKNOWN_OBJECT,
2806 "Unknown object '%s'.", m->path);
2820 static int bus_exit_now(sd_bus *bus) {
2823 /* Exit due to close, if this is requested. If this is bus object is attached to an event source, invokes
2824 * sd_event_exit(), otherwise invokes libc exit(). */
2826 if (bus->exited) /* did we already exit? */
2828 if (!bus->exit_triggered) /* was the exit condition triggered? */
2830 if (!bus->exit_on_disconnect) /* Shall we actually exit on disconnection? */
2833 bus->exited = true; /* never exit more than once */
2835 log_debug("Bus connection disconnected, exiting.");
2838 return sd_event_exit(bus->event, EXIT_FAILURE);
2842 assert_not_reached("exit() didn't exit?");
2845 static int process_closing_reply_callback(sd_bus *bus, struct reply_callback *c) {
2846 _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2847 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2854 r = bus_message_new_synthetic_error(
2857 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2862 r = bus_seal_synthetic_message(bus, m);
2866 if (c->timeout_usec != 0) {
2867 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2868 c->timeout_usec = 0;
2871 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2874 slot = container_of(c, sd_bus_slot, reply_callback);
2876 bus->iteration_counter++;
2878 bus->current_message = m;
2879 bus->current_slot = sd_bus_slot_ref(slot);
2880 bus->current_handler = c->callback;
2881 bus->current_userdata = slot->userdata;
2882 r = c->callback(m, slot->userdata, &error_buffer);
2883 bus->current_userdata = NULL;
2884 bus->current_handler = NULL;
2885 bus->current_slot = NULL;
2886 bus->current_message = NULL;
2888 if (slot->floating) {
2889 bus_slot_disconnect(slot);
2890 sd_bus_slot_unref(slot);
2893 sd_bus_slot_unref(slot);
2895 return bus_maybe_reply_error(m, r, &error_buffer);
2898 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2899 _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
2900 struct reply_callback *c;
2904 assert(bus->state == BUS_CLOSING);
2906 /* First, fail all outstanding method calls */
2907 c = ordered_hashmap_first(bus->reply_callbacks);
2909 return process_closing_reply_callback(bus, c);
2911 /* Then, fake-drop all remaining bus tracking references */
2913 bus_track_close(bus->tracks);
2917 /* Then, synthesize a Disconnected message */
2918 r = sd_bus_message_new_signal(
2921 "/org/freedesktop/DBus/Local",
2922 "org.freedesktop.DBus.Local",
2927 bus_message_set_sender_local(bus, m);
2929 r = bus_seal_synthetic_message(bus, m);
2935 bus->current_message = m;
2936 bus->iteration_counter++;
2938 r = process_filter(bus, m);
2942 r = process_match(bus, m);
2946 /* Nothing else to do, exit now, if the condition holds */
2947 bus->exit_triggered = true;
2948 (void) bus_exit_now(bus);
2956 bus->current_message = NULL;
2961 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2962 BUS_DONT_DESTROY(bus);
2965 /* Returns 0 when we didn't do anything. This should cause the
2966 * caller to invoke sd_bus_wait() before returning the next
2967 * time. Returns > 0 when we did something, which possibly
2968 * means *ret is filled in with an unprocessed message. */
2970 assert_return(bus, -EINVAL);
2971 assert_return(bus = bus_resolve(bus), -ENOPKG);
2972 assert_return(!bus_pid_changed(bus), -ECHILD);
2974 /* We don't allow recursively invoking sd_bus_process(). */
2975 assert_return(!bus->current_message, -EBUSY);
2976 assert(!bus->current_slot);
2978 switch (bus->state) {
2986 case BUS_WATCH_BIND:
2987 r = bus_socket_process_watch_bind(bus);
2991 r = bus_socket_process_opening(bus);
2994 case BUS_AUTHENTICATING:
2995 r = bus_socket_process_authenticating(bus);
3000 r = process_running(bus, hint_priority, priority, ret);
3004 /* This branch initializes *ret, hence we don't use the generic error checking below */
3008 return process_closing(bus, ret);
3011 assert_not_reached("Unknown state");
3014 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
3015 bus_enter_closing(bus);
3026 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
3027 return bus_process_internal(bus, false, 0, ret);
3030 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
3031 return bus_process_internal(bus, true, priority, ret);
3034 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
3035 struct pollfd p[2] = {};
3038 usec_t m = USEC_INFINITY;
3042 if (bus->state == BUS_CLOSING)
3045 if (!BUS_IS_OPEN(bus->state))
3048 if (bus->state == BUS_WATCH_BIND) {
3049 assert(bus->inotify_fd >= 0);
3051 p[0].events = POLLIN;
3052 p[0].fd = bus->inotify_fd;
3057 e = sd_bus_get_events(bus);
3062 /* The caller really needs some more data, he doesn't
3063 * care about what's already read, or any timeouts
3064 * except its own. */
3068 /* The caller wants to process if there's something to
3069 * process, but doesn't care otherwise */
3071 r = sd_bus_get_timeout(bus, &until);
3075 m = usec_sub_unsigned(until, now(CLOCK_MONOTONIC));
3078 p[0].fd = bus->input_fd;
3079 if (bus->output_fd == bus->input_fd) {
3083 p[0].events = e & POLLIN;
3084 p[1].fd = bus->output_fd;
3085 p[1].events = e & POLLOUT;
3090 if (timeout_usec != (uint64_t) -1 && (m == USEC_INFINITY || timeout_usec < m))
3093 r = ppoll(p, n, m == USEC_INFINITY ? NULL : timespec_store(&ts, m), NULL);
3097 return r > 0 ? 1 : 0;
3100 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
3102 assert_return(bus, -EINVAL);
3103 assert_return(bus = bus_resolve(bus), -ENOPKG);
3104 assert_return(!bus_pid_changed(bus), -ECHILD);
3106 if (bus->state == BUS_CLOSING)
3109 if (!BUS_IS_OPEN(bus->state))
3112 if (bus->rqueue_size > 0)
3115 return bus_poll(bus, false, timeout_usec);
3118 _public_ int sd_bus_flush(sd_bus *bus) {
3121 assert_return(bus, -EINVAL);
3122 assert_return(bus = bus_resolve(bus), -ENOPKG);
3123 assert_return(!bus_pid_changed(bus), -ECHILD);
3125 if (bus->state == BUS_CLOSING)
3128 if (!BUS_IS_OPEN(bus->state))
3131 /* We never were connected? Don't hang in inotify for good, as there's no timeout set for it */
3132 if (bus->state == BUS_WATCH_BIND)
3135 r = bus_ensure_running(bus);
3139 if (bus->wqueue_size <= 0)
3143 r = dispatch_wqueue(bus);
3145 if (IN_SET(r, -ENOTCONN, -ECONNRESET, -EPIPE, -ESHUTDOWN)) {
3146 bus_enter_closing(bus);
3153 if (bus->wqueue_size <= 0)
3156 r = bus_poll(bus, false, (uint64_t) -1);
3162 _public_ int sd_bus_add_filter(
3165 sd_bus_message_handler_t callback,
3170 assert_return(bus, -EINVAL);
3171 assert_return(bus = bus_resolve(bus), -ENOPKG);
3172 assert_return(callback, -EINVAL);
3173 assert_return(!bus_pid_changed(bus), -ECHILD);
3175 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
3179 s->filter_callback.callback = callback;
3181 bus->filter_callbacks_modified = true;
3182 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
3190 static int add_match_callback(
3193 sd_bus_error *ret_error) {
3195 sd_bus_slot *match_slot = userdata;
3196 bool failed = false;
3202 sd_bus_slot_ref(match_slot);
3204 if (sd_bus_message_is_method_error(m, NULL)) {
3205 log_debug_errno(sd_bus_message_get_errno(m),
3206 "Unable to add match %s, failing connection: %s",
3207 match_slot->match_callback.match_string,
3208 sd_bus_message_get_error(m)->message);
3212 log_debug("Match %s successfully installed.", match_slot->match_callback.match_string);
3214 if (match_slot->match_callback.install_callback) {
3217 bus = sd_bus_message_get_bus(m);
3219 /* This function has been called as slot handler, and we want to call another slot handler. Let's
3220 * update the slot callback metadata temporarily with our own data, and then revert back to the old
3223 assert(bus->current_slot == match_slot->match_callback.install_slot);
3224 assert(bus->current_handler == add_match_callback);
3225 assert(bus->current_userdata == userdata);
3227 bus->current_slot = match_slot;
3228 bus->current_handler = match_slot->match_callback.install_callback;
3229 bus->current_userdata = match_slot->userdata;
3231 r = match_slot->match_callback.install_callback(m, match_slot->userdata, ret_error);
3233 bus->current_slot = match_slot->match_callback.install_slot;
3234 bus->current_handler = add_match_callback;
3235 bus->current_userdata = userdata;
3237 match_slot->match_callback.install_slot = sd_bus_slot_unref(match_slot->match_callback.install_slot);
3239 if (failed) /* Generic failure handling: destroy the connection */
3240 bus_enter_closing(sd_bus_message_get_bus(m));
3245 if (failed && match_slot->floating) {
3246 bus_slot_disconnect(match_slot);
3247 sd_bus_slot_unref(match_slot);
3250 sd_bus_slot_unref(match_slot);
3255 static int bus_add_match_full(
3260 sd_bus_message_handler_t callback,
3261 sd_bus_message_handler_t install_callback,
3264 struct bus_match_component *components = NULL;
3265 unsigned n_components = 0;
3266 sd_bus_slot *s = NULL;
3269 assert_return(bus, -EINVAL);
3270 assert_return(bus = bus_resolve(bus), -ENOPKG);
3271 assert_return(match, -EINVAL);
3272 assert_return(!bus_pid_changed(bus), -ECHILD);
3274 r = bus_match_parse(match, &components, &n_components);
3278 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
3284 s->match_callback.callback = callback;
3285 s->match_callback.install_callback = install_callback;
3287 if (bus->bus_client) {
3288 enum bus_match_scope scope;
3290 scope = bus_match_get_scope(components, n_components);
3292 /* Do not install server-side matches for matches against the local service, interface or bus path. */
3293 if (scope != BUS_MATCH_LOCAL) {
3295 /* We store the original match string, so that we can use it to remove the match again. */
3297 s->match_callback.match_string = strdup(match);
3298 if (!s->match_callback.match_string) {
3304 r = bus_add_match_internal_async(bus,
3305 &s->match_callback.install_slot,
3306 s->match_callback.match_string,
3310 r = bus_add_match_internal(bus, s->match_callback.match_string);
3314 s->match_added = true;
3318 bus->match_callbacks_modified = true;
3319 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
3328 bus_match_parse_free(components, n_components);
3329 sd_bus_slot_unref(s);
3334 #if 0 /// UNNEEDED by elogind
3336 _public_ int sd_bus_add_match(
3340 sd_bus_message_handler_t callback,
3343 return bus_add_match_full(bus, slot, false, match, callback, NULL, userdata);
3346 _public_ int sd_bus_add_match_async(
3350 sd_bus_message_handler_t callback,
3351 sd_bus_message_handler_t install_callback,
3354 return bus_add_match_full(bus, slot, true, match, callback, install_callback, userdata);
3357 bool bus_pid_changed(sd_bus *bus) {
3360 /* We don't support people creating a bus connection and
3361 * keeping it around over a fork(). Let's complain. */
3363 return bus->original_pid != getpid_cached();
3366 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
3367 sd_bus *bus = userdata;
3372 /* Note that this is called both on input_fd, output_fd as well as inotify_fd events */
3374 r = sd_bus_process(bus, NULL);
3376 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3377 bus_enter_closing(bus);
3383 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
3384 sd_bus *bus = userdata;
3389 r = sd_bus_process(bus, NULL);
3391 log_debug_errno(r, "Processing of bus failed, closing down: %m");
3392 bus_enter_closing(bus);
3398 static int prepare_callback(sd_event_source *s, void *userdata) {
3399 sd_bus *bus = userdata;
3406 e = sd_bus_get_events(bus);
3412 if (bus->output_fd != bus->input_fd) {
3414 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
3418 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
3420 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
3424 r = sd_bus_get_timeout(bus, &until);
3430 j = sd_event_source_set_time(bus->time_event_source, until);
3437 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
3444 log_debug_errno(r, "Preparing of bus events failed, closing down: %m");
3445 bus_enter_closing(bus);
3450 static int quit_callback(sd_event_source *event, void *userdata) {
3451 sd_bus *bus = userdata;
3461 int bus_attach_io_events(sd_bus *bus) {
3466 if (bus->input_fd < 0)
3472 if (!bus->input_io_event_source) {
3473 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3477 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3481 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3485 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3487 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3492 if (bus->output_fd != bus->input_fd) {
3493 assert(bus->output_fd >= 0);
3495 if (!bus->output_io_event_source) {
3496 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3500 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3504 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3506 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3515 static void bus_detach_io_events(sd_bus *bus) {
3518 if (bus->input_io_event_source) {
3519 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3520 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3523 if (bus->output_io_event_source) {
3524 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3525 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3529 int bus_attach_inotify_event(sd_bus *bus) {
3534 if (bus->inotify_fd < 0)
3540 if (!bus->inotify_event_source) {
3541 r = sd_event_add_io(bus->event, &bus->inotify_event_source, bus->inotify_fd, EPOLLIN, io_callback, bus);
3545 r = sd_event_source_set_priority(bus->inotify_event_source, bus->event_priority);
3549 r = sd_event_source_set_description(bus->inotify_event_source, "bus-inotify");
3551 r = sd_event_source_set_io_fd(bus->inotify_event_source, bus->inotify_fd);
3558 static void bus_detach_inotify_event(sd_bus *bus) {
3561 if (bus->inotify_event_source) {
3562 sd_event_source_set_enabled(bus->inotify_event_source, SD_EVENT_OFF);
3563 bus->inotify_event_source = sd_event_source_unref(bus->inotify_event_source);
3567 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3570 assert_return(bus, -EINVAL);
3571 assert_return(bus = bus_resolve(bus), -ENOPKG);
3572 assert_return(!bus->event, -EBUSY);
3574 assert(!bus->input_io_event_source);
3575 assert(!bus->output_io_event_source);
3576 assert(!bus->time_event_source);
3579 bus->event = sd_event_ref(event);
3581 r = sd_event_default(&bus->event);
3586 bus->event_priority = priority;
3588 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3592 r = sd_event_source_set_priority(bus->time_event_source, priority);
3596 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3600 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3604 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3608 r = bus_attach_io_events(bus);
3612 r = bus_attach_inotify_event(bus);
3619 sd_bus_detach_event(bus);
3623 _public_ int sd_bus_detach_event(sd_bus *bus) {
3624 assert_return(bus, -EINVAL);
3625 assert_return(bus = bus_resolve(bus), -ENOPKG);
3630 bus_detach_io_events(bus);
3631 bus_detach_inotify_event(bus);
3633 if (bus->time_event_source) {
3634 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3635 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3638 if (bus->quit_event_source) {
3639 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3640 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3643 bus->event = sd_event_unref(bus->event);
3647 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3648 assert_return(bus, NULL);
3653 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3654 assert_return(bus, NULL);
3656 return bus->current_message;
3659 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3660 assert_return(bus, NULL);
3662 return bus->current_slot;
3665 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3666 assert_return(bus, NULL);
3668 return bus->current_handler;
3671 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3672 assert_return(bus, NULL);
3674 return bus->current_userdata;
3677 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3682 assert(default_bus);
3685 return !!*default_bus;
3688 *ret = sd_bus_ref(*default_bus);
3696 b->default_bus_ptr = default_bus;
3704 _public_ int sd_bus_default_system(sd_bus **ret) {
3705 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3709 _public_ int sd_bus_default_user(sd_bus **ret) {
3710 #if 0 /// elogind does not support user buses
3711 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3713 return sd_bus_default_system(ret);
3717 _public_ int sd_bus_default(sd_bus **ret) {
3718 int (*bus_open)(sd_bus **) = NULL;
3721 busp = bus_choose_default(&bus_open);
3722 return bus_default(bus_open, busp, ret);
3725 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3726 assert_return(b, -EINVAL);
3727 assert_return(tid, -EINVAL);
3728 assert_return(!bus_pid_changed(b), -ECHILD);
3736 return sd_event_get_tid(b->event, tid);
3741 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3742 _cleanup_free_ char *e = NULL;
3745 assert_return(object_path_is_valid(prefix), -EINVAL);
3746 assert_return(external_id, -EINVAL);
3747 assert_return(ret_path, -EINVAL);
3749 e = bus_label_escape(external_id);
3753 ret = strjoin(prefix, "/", e);
3761 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3765 assert_return(object_path_is_valid(path), -EINVAL);
3766 assert_return(object_path_is_valid(prefix), -EINVAL);
3767 assert_return(external_id, -EINVAL);
3769 e = object_path_startswith(path, prefix);
3771 *external_id = NULL;
3775 ret = bus_label_unescape(e);
3783 _public_ int sd_bus_path_encode_many(char **out, const char *path_template, ...) {
3784 _cleanup_strv_free_ char **labels = NULL;
3785 char *path, *path_pos, **label_pos;
3786 const char *sep, *template_pos;
3791 assert_return(out, -EINVAL);
3792 assert_return(path_template, -EINVAL);
3794 path_length = strlen(path_template);
3796 va_start(list, path_template);
3797 for (sep = strchr(path_template, '%'); sep; sep = strchr(sep + 1, '%')) {
3801 arg = va_arg(list, const char *);
3807 label = bus_label_escape(arg);
3813 r = strv_consume(&labels, label);
3819 /* add label length, but account for the format character */
3820 path_length += strlen(label) - 1;
3824 path = malloc(path_length + 1);
3831 for (template_pos = path_template; *template_pos; ) {
3832 sep = strchrnul(template_pos, '%');
3833 path_pos = mempcpy(path_pos, template_pos, sep - template_pos);
3837 path_pos = stpcpy(path_pos, *label_pos++);
3838 template_pos = sep + 1;
3846 _public_ int sd_bus_path_decode_many(const char *path, const char *path_template, ...) {
3847 _cleanup_strv_free_ char **labels = NULL;
3848 const char *template_pos, *path_pos;
3854 * This decodes an object-path based on a template argument. The
3855 * template consists of a verbatim path, optionally including special
3858 * - Each occurrence of '%' in the template matches an arbitrary
3859 * substring of a label in the given path. At most one such
3860 * directive is allowed per label. For each such directive, the
3861 * caller must provide an output parameter (char **) via va_arg. If
3862 * NULL is passed, the given label is verified, but not returned.
3863 * For each matched label, the *decoded* label is stored in the
3864 * passed output argument, and the caller is responsible to free
3865 * it. Note that the output arguments are only modified if the
3866 * actualy path matched the template. Otherwise, they're left
3869 * This function returns <0 on error, 0 if the path does not match the
3870 * template, 1 if it matched.
3873 assert_return(path, -EINVAL);
3874 assert_return(path_template, -EINVAL);
3878 for (template_pos = path_template; *template_pos; ) {
3883 /* verify everything until the next '%' matches verbatim */
3884 sep = strchrnul(template_pos, '%');
3885 length = sep - template_pos;
3886 if (strncmp(path_pos, template_pos, length))
3890 template_pos += length;
3895 /* We found the next '%' character. Everything up until here
3896 * matched. We now skip ahead to the end of this label and make
3897 * sure it matches the tail of the label in the path. Then we
3898 * decode the string in-between and save it for later use. */
3900 ++template_pos; /* skip over '%' */
3902 sep = strchrnul(template_pos, '/');
3903 length = sep - template_pos; /* length of suffix to match verbatim */
3905 /* verify the suffixes match */
3906 sep = strchrnul(path_pos, '/');
3907 if (sep - path_pos < (ssize_t)length ||
3908 strncmp(sep - length, template_pos, length))
3911 template_pos += length; /* skip over matched label */
3912 length = sep - path_pos - length; /* length of sub-label to decode */
3914 /* store unescaped label for later use */
3915 label = bus_label_unescape_n(path_pos, length);
3919 r = strv_consume(&labels, label);
3923 path_pos = sep; /* skip decoded label and suffix */
3926 /* end of template must match end of path */
3930 /* copy the labels over to the caller */
3931 va_start(list, path_template);
3932 for (label_pos = labels; label_pos && *label_pos; ++label_pos) {
3935 arg = va_arg(list, char **);
3943 labels = mfree(labels);
3947 _public_ int sd_bus_try_close(sd_bus *bus) {
3948 assert_return(bus, -EINVAL);
3949 assert_return(bus = bus_resolve(bus), -ENOPKG);
3950 assert_return(!bus_pid_changed(bus), -ECHILD);
3955 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3956 assert_return(bus, -EINVAL);
3957 assert_return(bus = bus_resolve(bus), -ENOPKG);
3958 assert_return(description, -EINVAL);
3959 assert_return(bus->description, -ENXIO);
3960 assert_return(!bus_pid_changed(bus), -ECHILD);
3962 if (bus->description)
3963 *description = bus->description;
3964 else if (bus->is_system)
3965 *description = "system";
3966 else if (bus->is_user)
3967 *description = "user";
3969 *description = NULL;
3974 int bus_get_root_path(sd_bus *bus) {
3977 if (bus->cgroup_root)
3980 r = cg_get_root_path(&bus->cgroup_root);
3982 bus->cgroup_root = strdup("/");
3983 if (!bus->cgroup_root)
3992 _public_ int sd_bus_get_scope(sd_bus *bus, const char **scope) {
3993 assert_return(bus, -EINVAL);
3994 assert_return(bus = bus_resolve(bus), -ENOPKG);
3995 assert_return(scope, -EINVAL);
3996 assert_return(!bus_pid_changed(bus), -ECHILD);
4003 if (bus->is_system) {
4011 _public_ int sd_bus_get_address(sd_bus *bus, const char **address) {
4013 assert_return(bus, -EINVAL);
4014 assert_return(bus = bus_resolve(bus), -ENOPKG);
4015 assert_return(address, -EINVAL);
4016 assert_return(!bus_pid_changed(bus), -ECHILD);
4019 *address = bus->address;
4026 _public_ int sd_bus_get_creds_mask(sd_bus *bus, uint64_t *mask) {
4027 assert_return(bus, -EINVAL);
4028 assert_return(bus = bus_resolve(bus), -ENOPKG);
4029 assert_return(mask, -EINVAL);
4030 assert_return(!bus_pid_changed(bus), -ECHILD);
4032 *mask = bus->creds_mask;
4036 _public_ int sd_bus_is_bus_client(sd_bus *bus) {
4037 assert_return(bus, -EINVAL);
4038 assert_return(bus = bus_resolve(bus), -ENOPKG);
4039 assert_return(!bus_pid_changed(bus), -ECHILD);
4041 return bus->bus_client;
4044 _public_ int sd_bus_is_server(sd_bus *bus) {
4045 assert_return(bus, -EINVAL);
4046 assert_return(bus = bus_resolve(bus), -ENOPKG);
4047 assert_return(!bus_pid_changed(bus), -ECHILD);
4049 return bus->is_server;
4052 _public_ int sd_bus_is_anonymous(sd_bus *bus) {
4053 assert_return(bus, -EINVAL);
4054 assert_return(bus = bus_resolve(bus), -ENOPKG);
4055 assert_return(!bus_pid_changed(bus), -ECHILD);
4057 return bus->anonymous_auth;
4060 _public_ int sd_bus_is_trusted(sd_bus *bus) {
4061 assert_return(bus, -EINVAL);
4062 assert_return(bus = bus_resolve(bus), -ENOPKG);
4063 assert_return(!bus_pid_changed(bus), -ECHILD);
4065 return bus->trusted;
4068 _public_ int sd_bus_is_monitor(sd_bus *bus) {
4069 assert_return(bus, -EINVAL);
4070 assert_return(bus = bus_resolve(bus), -ENOPKG);
4071 assert_return(!bus_pid_changed(bus), -ECHILD);
4073 return bus->is_monitor;
4076 static void flush_close(sd_bus *bus) {
4080 /* Flushes and closes the specified bus. We take a ref before,
4081 * to ensure the flushing does not cause the bus to be
4084 sd_bus_flush_close_unref(sd_bus_ref(bus));
4087 _public_ void sd_bus_default_flush_close(void) {
4088 flush_close(default_starter_bus);
4089 #if 0 /// elogind does not support user buses
4090 flush_close(default_user_bus);
4092 flush_close(default_system_bus);
4095 _public_ int sd_bus_set_exit_on_disconnect(sd_bus *bus, int b) {
4096 assert_return(bus, -EINVAL);
4097 assert_return(bus = bus_resolve(bus), -ENOPKG);
4099 /* Turns on exit-on-disconnect, and triggers it immediately if the bus connection was already
4100 * disconnected. Note that this is triggered exclusively on disconnections triggered by the server side, never
4101 * from the client side. */
4102 bus->exit_on_disconnect = b;
4104 /* If the exit condition was triggered already, exit immediately. */
4105 return bus_exit_now(bus);
4108 _public_ int sd_bus_get_exit_on_disconnect(sd_bus *bus) {
4109 assert_return(bus, -EINVAL);
4110 assert_return(bus = bus_resolve(bus), -ENOPKG);
4112 return bus->exit_on_disconnect;
4115 _public_ int sd_bus_set_sender(sd_bus *bus, const char *sender) {
4116 assert_return(bus, -EINVAL);
4117 assert_return(bus = bus_resolve(bus), -ENOPKG);
4118 assert_return(!bus->bus_client, -EPERM);
4119 assert_return(!sender || service_name_is_valid(sender), -EINVAL);
4121 return free_and_strdup(&bus->patch_sender, sender);
4124 _public_ int sd_bus_get_sender(sd_bus *bus, const char **ret) {
4125 assert_return(bus, -EINVAL);
4126 assert_return(bus = bus_resolve(bus), -ENOPKG);
4127 assert_return(ret, -EINVAL);
4129 if (!bus->patch_sender)
4132 *ret = bus->patch_sender;
4136 _public_ int sd_bus_get_n_queued_read(sd_bus *bus, uint64_t *ret) {
4137 assert_return(bus, -EINVAL);
4138 assert_return(bus = bus_resolve(bus), -ENOPKG);
4139 assert_return(!bus_pid_changed(bus), -ECHILD);
4140 assert_return(ret, -EINVAL);
4142 *ret = bus->rqueue_size;
4146 _public_ int sd_bus_get_n_queued_write(sd_bus *bus, uint64_t *ret) {
4147 assert_return(bus, -EINVAL);
4148 assert_return(bus = bus_resolve(bus), -ENOPKG);
4149 assert_return(!bus_pid_changed(bus), -ECHILD);
4150 assert_return(ret, -EINVAL);
4152 *ret = bus->wqueue_size;