1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
38 #include "cgroup-util.h"
39 #include "bus-label.h"
42 #include "bus-internal.h"
43 #include "bus-message.h"
45 #include "bus-socket.h"
46 #include "bus-kernel.h"
47 #include "bus-control.h"
48 #include "bus-introspect.h"
49 #include "bus-signature.h"
50 #include "bus-objects.h"
52 #include "bus-container.h"
53 #include "bus-protocol.h"
54 #include "bus-track.h"
57 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec);
58 static int attach_io_events(sd_bus *b);
59 static void detach_io_events(sd_bus *b);
61 static void bus_close_fds(sd_bus *b) {
67 safe_close(b->input_fd);
69 if (b->output_fd >= 0 && b->output_fd != b->input_fd)
70 safe_close(b->output_fd);
72 b->input_fd = b->output_fd = -1;
75 static void bus_reset_queues(sd_bus *b) {
78 while (b->rqueue_size > 0)
79 sd_bus_message_unref(b->rqueue[--b->rqueue_size]);
83 b->rqueue_allocated = 0;
85 while (b->wqueue_size > 0)
86 sd_bus_message_unref(b->wqueue[--b->wqueue_size]);
90 b->wqueue_allocated = 0;
93 static void bus_free(sd_bus *b) {
97 assert(!b->track_queue);
99 b->state = BUS_CLOSED;
101 sd_bus_detach_event(b);
103 while ((s = b->slots)) {
104 /* At this point only floating slots can still be
105 * around, because the non-floating ones keep a
106 * reference to the bus, and we thus couldn't be
107 * destructing right now... We forcibly disconnect the
108 * slots here, so that they still can be referenced by
109 * apps, but are dead. */
112 bus_slot_disconnect(s);
113 sd_bus_slot_unref(s);
116 if (b->default_bus_ptr)
117 *b->default_bus_ptr = NULL;
122 munmap(b->kdbus_buffer, KDBUS_POOL_SIZE);
125 free(b->unique_name);
126 free(b->auth_buffer);
131 free(b->cgroup_root);
132 free(b->description);
135 strv_free(b->exec_argv);
137 close_many(b->fds, b->n_fds);
142 ordered_hashmap_free_free(b->reply_callbacks);
143 prioq_free(b->reply_callbacks_prioq);
145 assert(b->match_callbacks.type == BUS_MATCH_ROOT);
146 bus_match_free(&b->match_callbacks);
148 hashmap_free_free(b->vtable_methods);
149 hashmap_free_free(b->vtable_properties);
151 assert(hashmap_isempty(b->nodes));
152 hashmap_free(b->nodes);
154 bus_kernel_flush_memfd(b);
156 assert_se(pthread_mutex_destroy(&b->memfd_cache_mutex) == 0);
161 _public_ int sd_bus_new(sd_bus **ret) {
164 assert_return(ret, -EINVAL);
170 r->n_ref = REFCNT_INIT;
171 r->input_fd = r->output_fd = -1;
172 r->message_version = 1;
173 r->creds_mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
174 r->hello_flags |= KDBUS_HELLO_ACCEPT_FD;
175 r->attach_flags |= KDBUS_ATTACH_NAMES;
176 r->original_pid = getpid();
178 assert_se(pthread_mutex_init(&r->memfd_cache_mutex, NULL) == 0);
180 /* We guarantee that wqueue always has space for at least one
182 if (!GREEDY_REALLOC(r->wqueue, r->wqueue_allocated, 1)) {
191 _public_ int sd_bus_set_address(sd_bus *bus, const char *address) {
194 assert_return(bus, -EINVAL);
195 assert_return(bus->state == BUS_UNSET, -EPERM);
196 assert_return(address, -EINVAL);
197 assert_return(!bus_pid_changed(bus), -ECHILD);
209 _public_ int sd_bus_set_fd(sd_bus *bus, int input_fd, int output_fd) {
210 assert_return(bus, -EINVAL);
211 assert_return(bus->state == BUS_UNSET, -EPERM);
212 assert_return(input_fd >= 0, -EINVAL);
213 assert_return(output_fd >= 0, -EINVAL);
214 assert_return(!bus_pid_changed(bus), -ECHILD);
216 bus->input_fd = input_fd;
217 bus->output_fd = output_fd;
221 _public_ int sd_bus_set_exec(sd_bus *bus, const char *path, char *const argv[]) {
224 assert_return(bus, -EINVAL);
225 assert_return(bus->state == BUS_UNSET, -EPERM);
226 assert_return(path, -EINVAL);
227 assert_return(!strv_isempty(argv), -EINVAL);
228 assert_return(!bus_pid_changed(bus), -ECHILD);
240 free(bus->exec_path);
241 strv_free(bus->exec_argv);
249 _public_ int sd_bus_set_bus_client(sd_bus *bus, int b) {
250 assert_return(bus, -EINVAL);
251 assert_return(bus->state == BUS_UNSET, -EPERM);
252 assert_return(!bus_pid_changed(bus), -ECHILD);
254 bus->bus_client = !!b;
258 _public_ int sd_bus_set_monitor(sd_bus *bus, int b) {
259 assert_return(bus, -EINVAL);
260 assert_return(bus->state == BUS_UNSET, -EPERM);
261 assert_return(!bus_pid_changed(bus), -ECHILD);
263 SET_FLAG(bus->hello_flags, KDBUS_HELLO_MONITOR, b);
267 _public_ int sd_bus_negotiate_fds(sd_bus *bus, int b) {
268 assert_return(bus, -EINVAL);
269 assert_return(bus->state == BUS_UNSET, -EPERM);
270 assert_return(!bus_pid_changed(bus), -ECHILD);
272 SET_FLAG(bus->hello_flags, KDBUS_HELLO_ACCEPT_FD, b);
276 _public_ int sd_bus_negotiate_timestamp(sd_bus *bus, int b) {
277 assert_return(bus, -EINVAL);
278 assert_return(bus->state == BUS_UNSET, -EPERM);
279 assert_return(!bus_pid_changed(bus), -ECHILD);
281 SET_FLAG(bus->attach_flags, KDBUS_ATTACH_TIMESTAMP, b);
285 _public_ int sd_bus_negotiate_creds(sd_bus *bus, uint64_t mask) {
286 assert_return(bus, -EINVAL);
287 assert_return(mask <= _SD_BUS_CREDS_ALL, -EINVAL);
288 assert_return(bus->state == BUS_UNSET, -EPERM);
289 assert_return(!bus_pid_changed(bus), -ECHILD);
291 /* The well knowns we need unconditionally, so that matches can work */
292 bus->creds_mask = mask | SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME;
294 return kdbus_translate_attach_flags(bus->creds_mask, &bus->attach_flags);
297 _public_ int sd_bus_set_server(sd_bus *bus, int b, sd_id128_t server_id) {
298 assert_return(bus, -EINVAL);
299 assert_return(b || sd_id128_equal(server_id, SD_ID128_NULL), -EINVAL);
300 assert_return(bus->state == BUS_UNSET, -EPERM);
301 assert_return(!bus_pid_changed(bus), -ECHILD);
303 bus->is_server = !!b;
304 bus->server_id = server_id;
308 _public_ int sd_bus_set_anonymous(sd_bus *bus, int b) {
309 assert_return(bus, -EINVAL);
310 assert_return(bus->state == BUS_UNSET, -EPERM);
311 assert_return(!bus_pid_changed(bus), -ECHILD);
313 bus->anonymous_auth = !!b;
317 _public_ int sd_bus_set_trusted(sd_bus *bus, int b) {
318 assert_return(bus, -EINVAL);
319 assert_return(bus->state == BUS_UNSET, -EPERM);
320 assert_return(!bus_pid_changed(bus), -ECHILD);
326 _public_ int sd_bus_set_description(sd_bus *bus, const char *description) {
327 assert_return(bus, -EINVAL);
328 assert_return(description, -EINVAL);
329 assert_return(bus->state == BUS_UNSET, -EPERM);
330 assert_return(!bus_pid_changed(bus), -ECHILD);
332 return free_and_strdup(&bus->description, description);
335 static int hello_callback(sd_bus *bus, sd_bus_message *reply, void *userdata, sd_bus_error *error) {
340 assert(bus->state == BUS_HELLO || bus->state == BUS_CLOSING);
343 r = sd_bus_message_get_errno(reply);
347 r = sd_bus_message_read(reply, "s", &s);
351 if (!service_name_is_valid(s) || s[0] != ':')
354 bus->unique_name = strdup(s);
355 if (!bus->unique_name)
358 if (bus->state == BUS_HELLO)
359 bus->state = BUS_RUNNING;
364 static int bus_send_hello(sd_bus *bus) {
365 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
370 if (!bus->bus_client || bus->is_kernel)
373 r = sd_bus_message_new_method_call(
376 "org.freedesktop.DBus",
377 "/org/freedesktop/DBus",
378 "org.freedesktop.DBus",
383 return sd_bus_call_async(bus, NULL, m, hello_callback, NULL, 0);
386 int bus_start_running(sd_bus *bus) {
389 if (bus->bus_client && !bus->is_kernel) {
390 bus->state = BUS_HELLO;
394 bus->state = BUS_RUNNING;
398 static int parse_address_key(const char **p, const char *key, char **value) {
399 size_t l, n = 0, allocated = 0;
409 if (strncmp(*p, key, l) != 0)
422 while (*a != ';' && *a != ',' && *a != 0) {
440 c = (char) ((x << 4) | y);
447 if (!GREEDY_REALLOC(r, allocated, n + 2))
471 static void skip_address_key(const char **p) {
475 *p += strcspn(*p, ",");
481 static int parse_unix_address(sd_bus *b, const char **p, char **guid) {
482 _cleanup_free_ char *path = NULL, *abstract = NULL;
491 while (**p != 0 && **p != ';') {
492 r = parse_address_key(p, "guid", guid);
498 r = parse_address_key(p, "path", &path);
504 r = parse_address_key(p, "abstract", &abstract);
513 if (!path && !abstract)
516 if (path && abstract)
521 if (l > sizeof(b->sockaddr.un.sun_path))
524 b->sockaddr.un.sun_family = AF_UNIX;
525 strncpy(b->sockaddr.un.sun_path, path, sizeof(b->sockaddr.un.sun_path));
526 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + l;
527 } else if (abstract) {
528 l = strlen(abstract);
529 if (l > sizeof(b->sockaddr.un.sun_path) - 1)
532 b->sockaddr.un.sun_family = AF_UNIX;
533 b->sockaddr.un.sun_path[0] = 0;
534 strncpy(b->sockaddr.un.sun_path+1, abstract, sizeof(b->sockaddr.un.sun_path)-1);
535 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + 1 + l;
541 static int parse_tcp_address(sd_bus *b, const char **p, char **guid) {
542 _cleanup_free_ char *host = NULL, *port = NULL, *family = NULL;
544 struct addrinfo *result, hints = {
545 .ai_socktype = SOCK_STREAM,
546 .ai_flags = AI_ADDRCONFIG,
554 while (**p != 0 && **p != ';') {
555 r = parse_address_key(p, "guid", guid);
561 r = parse_address_key(p, "host", &host);
567 r = parse_address_key(p, "port", &port);
573 r = parse_address_key(p, "family", &family);
586 if (streq(family, "ipv4"))
587 hints.ai_family = AF_INET;
588 else if (streq(family, "ipv6"))
589 hints.ai_family = AF_INET6;
594 r = getaddrinfo(host, port, &hints, &result);
598 return -EADDRNOTAVAIL;
600 memcpy(&b->sockaddr, result->ai_addr, result->ai_addrlen);
601 b->sockaddr_size = result->ai_addrlen;
603 freeaddrinfo(result);
608 static int parse_exec_address(sd_bus *b, const char **p, char **guid) {
610 unsigned n_argv = 0, j;
612 size_t allocated = 0;
620 while (**p != 0 && **p != ';') {
621 r = parse_address_key(p, "guid", guid);
627 r = parse_address_key(p, "path", &path);
633 if (startswith(*p, "argv")) {
637 ul = strtoul(*p + 4, (char**) p, 10);
638 if (errno > 0 || **p != '=' || ul > 256) {
646 if (!GREEDY_REALLOC0(argv, allocated, ul + 2)) {
654 r = parse_address_key(p, NULL, argv + ul);
669 /* Make sure there are no holes in the array, with the
670 * exception of argv[0] */
671 for (j = 1; j < n_argv; j++)
677 if (argv && argv[0] == NULL) {
678 argv[0] = strdup(path);
690 for (j = 0; j < n_argv; j++)
698 static int parse_kernel_address(sd_bus *b, const char **p, char **guid) {
699 _cleanup_free_ char *path = NULL;
707 while (**p != 0 && **p != ';') {
708 r = parse_address_key(p, "guid", guid);
714 r = parse_address_key(p, "path", &path);
733 static int parse_container_unix_address(sd_bus *b, const char **p, char **guid) {
734 _cleanup_free_ char *machine = NULL;
742 while (**p != 0 && **p != ';') {
743 r = parse_address_key(p, "guid", guid);
749 r = parse_address_key(p, "machine", &machine);
761 if (!machine_name_is_valid(machine))
765 b->machine = machine;
768 b->sockaddr.un.sun_family = AF_UNIX;
769 strncpy(b->sockaddr.un.sun_path, "/var/run/dbus/system_bus_socket", sizeof(b->sockaddr.un.sun_path));
770 b->sockaddr_size = offsetof(struct sockaddr_un, sun_path) + strlen("/var/run/dbus/system_bus_socket");
775 static int parse_container_kernel_address(sd_bus *b, const char **p, char **guid) {
776 _cleanup_free_ char *machine = NULL;
784 while (**p != 0 && **p != ';') {
785 r = parse_address_key(p, "guid", guid);
791 r = parse_address_key(p, "machine", &machine);
803 if (!machine_name_is_valid(machine))
807 b->machine = machine;
811 b->kernel = strdup("/dev/kdbus/0-system/bus");
818 static void bus_reset_parsed_address(sd_bus *b) {
822 b->sockaddr_size = 0;
823 strv_free(b->exec_argv);
827 b->server_id = SD_ID128_NULL;
834 static int bus_parse_next_address(sd_bus *b) {
835 _cleanup_free_ char *guid = NULL;
843 if (b->address[b->address_index] == 0)
846 bus_reset_parsed_address(b);
848 a = b->address + b->address_index;
857 if (startswith(a, "unix:")) {
860 r = parse_unix_address(b, &a, &guid);
865 } else if (startswith(a, "tcp:")) {
868 r = parse_tcp_address(b, &a, &guid);
874 } else if (startswith(a, "unixexec:")) {
877 r = parse_exec_address(b, &a, &guid);
883 } else if (startswith(a, "kernel:")) {
886 r = parse_kernel_address(b, &a, &guid);
891 } else if (startswith(a, "x-container-unix:")) {
894 r = parse_container_unix_address(b, &a, &guid);
899 } else if (startswith(a, "x-container-kernel:")) {
902 r = parse_container_kernel_address(b, &a, &guid);
915 r = sd_id128_from_string(guid, &b->server_id);
920 b->address_index = a - b->address;
924 static int bus_start_address(sd_bus *b) {
930 bool skipped = false;
935 r = bus_socket_exec(b);
936 else if (b->machine && b->kernel)
937 r = bus_container_connect_kernel(b);
938 else if (b->machine && b->sockaddr.sa.sa_family != AF_UNSPEC)
939 r = bus_container_connect_socket(b);
941 r = bus_kernel_connect(b);
942 else if (b->sockaddr.sa.sa_family != AF_UNSPEC)
943 r = bus_socket_connect(b);
949 r = attach_io_events(b);
954 b->last_connect_error = -r;
957 r = bus_parse_next_address(b);
961 return b->last_connect_error ? -b->last_connect_error : -ECONNREFUSED;
965 int bus_next_address(sd_bus *b) {
968 bus_reset_parsed_address(b);
969 return bus_start_address(b);
972 static int bus_start_fd(sd_bus *b) {
977 assert(b->input_fd >= 0);
978 assert(b->output_fd >= 0);
980 r = fd_nonblock(b->input_fd, true);
984 r = fd_cloexec(b->input_fd, true);
988 if (b->input_fd != b->output_fd) {
989 r = fd_nonblock(b->output_fd, true);
993 r = fd_cloexec(b->output_fd, true);
998 if (fstat(b->input_fd, &st) < 0)
1001 if (S_ISCHR(b->input_fd))
1002 return bus_kernel_take_fd(b);
1004 return bus_socket_take_fd(b);
1007 _public_ int sd_bus_start(sd_bus *bus) {
1010 assert_return(bus, -EINVAL);
1011 assert_return(bus->state == BUS_UNSET, -EPERM);
1012 assert_return(!bus_pid_changed(bus), -ECHILD);
1014 bus->state = BUS_OPENING;
1016 if (bus->is_server && bus->bus_client)
1019 if (bus->input_fd >= 0)
1020 r = bus_start_fd(bus);
1021 else if (bus->address || bus->sockaddr.sa.sa_family != AF_UNSPEC || bus->exec_path || bus->kernel || bus->machine)
1022 r = bus_start_address(bus);
1031 return bus_send_hello(bus);
1034 _public_ int sd_bus_open(sd_bus **ret) {
1039 assert_return(ret, -EINVAL);
1041 /* Let's connect to the starter bus if it is set, and
1042 * otherwise to the bus that is appropropriate for the scope
1043 * we are running in */
1045 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
1047 if (streq(e, "system"))
1048 return sd_bus_open_system(ret);
1049 else if (STR_IN_SET(e, "session", "user"))
1050 return sd_bus_open_user(ret);
1053 e = secure_getenv("DBUS_STARTER_ADDRESS");
1055 if (cg_pid_get_owner_uid(0, NULL) >= 0)
1056 return sd_bus_open_user(ret);
1058 return sd_bus_open_system(ret);
1065 r = sd_bus_set_address(b, e);
1069 b->bus_client = true;
1071 /* We don't know whether the bus is trusted or not, so better
1072 * be safe, and authenticate everything */
1074 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1076 r = sd_bus_start(b);
1088 int bus_set_address_system(sd_bus *b) {
1092 e = secure_getenv("DBUS_SYSTEM_BUS_ADDRESS");
1094 return sd_bus_set_address(b, e);
1096 return sd_bus_set_address(b, DEFAULT_SYSTEM_BUS_PATH);
1099 _public_ int sd_bus_open_system(sd_bus **ret) {
1103 assert_return(ret, -EINVAL);
1109 r = bus_set_address_system(b);
1113 b->bus_client = true;
1114 b->is_system = true;
1116 /* Let's do per-method access control on the system bus. We
1117 * need the caller's UID and capability set for that. */
1119 b->attach_flags |= KDBUS_ATTACH_CAPS | KDBUS_ATTACH_CREDS;
1121 r = sd_bus_start(b);
1133 int bus_set_address_user(sd_bus *b) {
1138 e = secure_getenv("DBUS_SESSION_BUS_ADDRESS");
1140 return sd_bus_set_address(b, e);
1142 e = secure_getenv("XDG_RUNTIME_DIR");
1144 _cleanup_free_ char *ee = NULL;
1146 ee = bus_address_escape(e);
1151 (void) asprintf(&b->address, KERNEL_USER_BUS_FMT ";" UNIX_USER_BUS_FMT, getuid(), ee);
1153 (void) asprintf(&b->address, UNIX_USER_BUS_FMT, ee);
1157 (void) asprintf(&b->address, KERNEL_USER_BUS_FMT, getuid());
1159 return -ECONNREFUSED;
1169 _public_ int sd_bus_open_user(sd_bus **ret) {
1173 assert_return(ret, -EINVAL);
1179 r = bus_set_address_user(b);
1183 b->bus_client = true;
1186 /* We don't do any per-method access control on the user
1190 r = sd_bus_start(b);
1202 int bus_set_address_system_remote(sd_bus *b, const char *host) {
1203 _cleanup_free_ char *e = NULL;
1204 char *m = NULL, *c = NULL;
1209 /* Let's see if we shall enter some container */
1210 m = strchr(host, ':');
1214 /* Let's make sure this is not a port of some kind,
1215 * and is a valid machine name. */
1216 if (!in_charset(m, "0123456789") && machine_name_is_valid(m)) {
1219 /* Cut out the host part */
1220 t = strndupa(host, m - host - 1);
1221 e = bus_address_escape(t);
1225 c = strappenda(",argv4=--machine=", m);
1230 e = bus_address_escape(host);
1235 b->address = strjoin("unixexec:path=ssh,argv1=-xT,argv2=", e, ",argv3=systemd-stdio-bridge", c, NULL);
1242 _public_ int sd_bus_open_system_remote(sd_bus **ret, const char *host) {
1246 assert_return(host, -EINVAL);
1247 assert_return(ret, -EINVAL);
1249 r = sd_bus_new(&bus);
1253 r = bus_set_address_system_remote(bus, host);
1257 bus->bus_client = true;
1258 bus->trusted = false;
1260 r = sd_bus_start(bus);
1272 int bus_set_address_system_container(sd_bus *b, const char *machine) {
1273 _cleanup_free_ char *e = NULL;
1278 e = bus_address_escape(machine);
1283 b->address = strjoin("x-container-kernel:machine=", e, ";x-container-unix:machine=", e, NULL);
1285 b->address = strjoin("x-container-unix:machine=", e, NULL);
1293 _public_ int sd_bus_open_system_container(sd_bus **ret, const char *machine) {
1297 assert_return(machine, -EINVAL);
1298 assert_return(ret, -EINVAL);
1299 assert_return(machine_name_is_valid(machine), -EINVAL);
1301 r = sd_bus_new(&bus);
1305 r = bus_set_address_system_container(bus, machine);
1309 bus->bus_client = true;
1310 bus->trusted = false;
1312 r = sd_bus_start(bus);
1324 _public_ void sd_bus_close(sd_bus *bus) {
1328 if (bus->state == BUS_CLOSED)
1330 if (bus_pid_changed(bus))
1333 bus->state = BUS_CLOSED;
1335 sd_bus_detach_event(bus);
1337 /* Drop all queued messages so that they drop references to
1338 * the bus object and the bus may be freed */
1339 bus_reset_queues(bus);
1341 if (!bus->is_kernel)
1344 /* We'll leave the fd open in case this is a kernel bus, since
1345 * there might still be memblocks around that reference this
1346 * bus, and they might need to invoke the KDBUS_CMD_FREE
1347 * ioctl on the fd when they are freed. */
1350 static void bus_enter_closing(sd_bus *bus) {
1353 if (bus->state != BUS_OPENING &&
1354 bus->state != BUS_AUTHENTICATING &&
1355 bus->state != BUS_HELLO &&
1356 bus->state != BUS_RUNNING)
1359 bus->state = BUS_CLOSING;
1362 _public_ sd_bus *sd_bus_ref(sd_bus *bus) {
1363 assert_return(bus, NULL);
1365 assert_se(REFCNT_INC(bus->n_ref) >= 2);
1370 _public_ sd_bus *sd_bus_unref(sd_bus *bus) {
1376 i = REFCNT_DEC(bus->n_ref);
1384 _public_ int sd_bus_is_open(sd_bus *bus) {
1386 assert_return(bus, -EINVAL);
1387 assert_return(!bus_pid_changed(bus), -ECHILD);
1389 return BUS_IS_OPEN(bus->state);
1392 _public_ int sd_bus_can_send(sd_bus *bus, char type) {
1395 assert_return(bus, -EINVAL);
1396 assert_return(bus->state != BUS_UNSET, -ENOTCONN);
1397 assert_return(!bus_pid_changed(bus), -ECHILD);
1399 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
1402 if (type == SD_BUS_TYPE_UNIX_FD) {
1403 if (!(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD))
1406 r = bus_ensure_running(bus);
1410 return bus->can_fds;
1413 return bus_type_is_valid(type);
1416 _public_ int sd_bus_get_server_id(sd_bus *bus, sd_id128_t *server_id) {
1419 assert_return(bus, -EINVAL);
1420 assert_return(server_id, -EINVAL);
1421 assert_return(!bus_pid_changed(bus), -ECHILD);
1423 r = bus_ensure_running(bus);
1427 *server_id = bus->server_id;
1431 static int bus_seal_message(sd_bus *b, sd_bus_message *m, usec_t timeout) {
1436 /* If we copy the same message to multiple
1437 * destinations, avoid using the same cookie
1439 b->cookie = MAX(b->cookie, BUS_MESSAGE_COOKIE(m));
1444 timeout = BUS_DEFAULT_TIMEOUT;
1446 return bus_message_seal(m, ++b->cookie, timeout);
1449 static int bus_remarshal_message(sd_bus *b, sd_bus_message **m) {
1452 /* Do packet version and endianness already match? */
1453 if ((b->message_version == 0 || b->message_version == (*m)->header->version) &&
1454 (b->message_endian == 0 || b->message_endian == (*m)->header->endian))
1457 /* No? Then remarshal! */
1458 return bus_message_remarshal(b, m);
1461 int bus_seal_synthetic_message(sd_bus *b, sd_bus_message *m) {
1465 /* The bus specification says the serial number cannot be 0,
1466 * hence let's fill something in for synthetic messages. Since
1467 * synthetic messages might have a fake sender and we don't
1468 * want to interfere with the real sender's serial numbers we
1469 * pick a fixed, artificial one. We use (uint32_t) -1 rather
1470 * than (uint64_t) -1 since dbus1 only had 32bit identifiers,
1471 * even though kdbus can do 64bit. */
1473 return bus_message_seal(m, 0xFFFFFFFFULL, 0);
1476 static int bus_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call, size_t *idx) {
1483 r = bus_kernel_write_message(bus, m, hint_sync_call);
1485 r = bus_socket_write_message(bus, m, idx);
1490 if (bus->is_kernel || *idx >= BUS_MESSAGE_SIZE(m))
1491 log_debug("Sent message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
1492 bus_message_type_to_string(m->header->type),
1493 strna(sd_bus_message_get_sender(m)),
1494 strna(sd_bus_message_get_destination(m)),
1495 strna(sd_bus_message_get_path(m)),
1496 strna(sd_bus_message_get_interface(m)),
1497 strna(sd_bus_message_get_member(m)),
1498 BUS_MESSAGE_COOKIE(m),
1500 strna(m->error.message));
1505 static int dispatch_wqueue(sd_bus *bus) {
1509 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1511 while (bus->wqueue_size > 0) {
1513 r = bus_write_message(bus, bus->wqueue[0], false, &bus->windex);
1517 /* Didn't do anything this time */
1519 else if (bus->is_kernel || bus->windex >= BUS_MESSAGE_SIZE(bus->wqueue[0])) {
1520 /* Fully written. Let's drop the entry from
1523 * This isn't particularly optimized, but
1524 * well, this is supposed to be our worst-case
1525 * buffer only, and the socket buffer is
1526 * supposed to be our primary buffer, and if
1527 * it got full, then all bets are off
1530 bus->wqueue_size --;
1531 sd_bus_message_unref(bus->wqueue[0]);
1532 memmove(bus->wqueue, bus->wqueue + 1, sizeof(sd_bus_message*) * bus->wqueue_size);
1542 static int bus_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1546 return bus_kernel_read_message(bus, hint_priority, priority);
1548 return bus_socket_read_message(bus);
1551 int bus_rqueue_make_room(sd_bus *bus) {
1554 if (bus->rqueue_size >= BUS_RQUEUE_MAX)
1557 if (!GREEDY_REALLOC(bus->rqueue, bus->rqueue_allocated, bus->rqueue_size + 1))
1563 static int dispatch_rqueue(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **m) {
1568 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
1570 /* Note that the priority logic is only available on kdbus,
1571 * where the rqueue is unused. We check the rqueue here
1572 * anyway, because it's simple... */
1575 if (bus->rqueue_size > 0) {
1576 /* Dispatch a queued message */
1578 *m = bus->rqueue[0];
1579 bus->rqueue_size --;
1580 memmove(bus->rqueue, bus->rqueue + 1, sizeof(sd_bus_message*) * bus->rqueue_size);
1584 /* Try to read a new message */
1585 r = bus_read_message(bus, hint_priority, priority);
1595 static int bus_send_internal(sd_bus *bus, sd_bus_message *_m, uint64_t *cookie, bool hint_sync_call) {
1596 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1599 assert_return(bus, -EINVAL);
1600 assert_return(m, -EINVAL);
1601 assert_return(!bus_pid_changed(bus), -ECHILD);
1602 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1604 if (!BUS_IS_OPEN(bus->state))
1608 r = sd_bus_can_send(bus, SD_BUS_TYPE_UNIX_FD);
1615 /* If the cookie number isn't kept, then we know that no reply
1617 if (!cookie && !m->sealed)
1618 m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
1620 r = bus_seal_message(bus, m, 0);
1624 /* Remarshall if we have to. This will possibly unref the
1625 * message and place a replacement in m */
1626 r = bus_remarshal_message(bus, &m);
1630 /* If this is a reply and no reply was requested, then let's
1631 * suppress this, if we can */
1632 if (m->dont_send && !cookie)
1635 if ((bus->state == BUS_RUNNING || bus->state == BUS_HELLO) && bus->wqueue_size <= 0) {
1638 r = bus_write_message(bus, m, hint_sync_call, &idx);
1640 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1641 bus_enter_closing(bus);
1646 } else if (!bus->is_kernel && idx < BUS_MESSAGE_SIZE(m)) {
1647 /* Wasn't fully written. So let's remember how
1648 * much was written. Note that the first entry
1649 * of the wqueue array is always allocated so
1650 * that we always can remember how much was
1652 bus->wqueue[0] = sd_bus_message_ref(m);
1653 bus->wqueue_size = 1;
1657 /* Just append it to the queue. */
1659 if (bus->wqueue_size >= BUS_WQUEUE_MAX)
1662 if (!GREEDY_REALLOC(bus->wqueue, bus->wqueue_allocated, bus->wqueue_size + 1))
1665 bus->wqueue[bus->wqueue_size ++] = sd_bus_message_ref(m);
1669 *cookie = BUS_MESSAGE_COOKIE(m);
1674 _public_ int sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) {
1675 return bus_send_internal(bus, m, cookie, false);
1678 _public_ int sd_bus_send_to(sd_bus *bus, sd_bus_message *m, const char *destination, uint64_t *cookie) {
1681 assert_return(bus, -EINVAL);
1682 assert_return(m, -EINVAL);
1683 assert_return(!bus_pid_changed(bus), -ECHILD);
1685 if (!BUS_IS_OPEN(bus->state))
1688 if (!streq_ptr(m->destination, destination)) {
1693 r = sd_bus_message_set_destination(m, destination);
1698 return sd_bus_send(bus, m, cookie);
1701 static usec_t calc_elapse(uint64_t usec) {
1702 if (usec == (uint64_t) -1)
1705 return now(CLOCK_MONOTONIC) + usec;
1708 static int timeout_compare(const void *a, const void *b) {
1709 const struct reply_callback *x = a, *y = b;
1711 if (x->timeout != 0 && y->timeout == 0)
1714 if (x->timeout == 0 && y->timeout != 0)
1717 if (x->timeout < y->timeout)
1720 if (x->timeout > y->timeout)
1726 _public_ int sd_bus_call_async(
1730 sd_bus_message_handler_t callback,
1734 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1735 _cleanup_bus_slot_unref_ sd_bus_slot *s = NULL;
1738 assert_return(bus, -EINVAL);
1739 assert_return(m, -EINVAL);
1740 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1741 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1742 assert_return(callback, -EINVAL);
1743 assert_return(!bus_pid_changed(bus), -ECHILD);
1744 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1746 if (!BUS_IS_OPEN(bus->state))
1749 r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
1753 r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
1757 r = bus_seal_message(bus, m, usec);
1761 r = bus_remarshal_message(bus, &m);
1765 s = bus_slot_allocate(bus, !slot, BUS_REPLY_CALLBACK, sizeof(struct reply_callback), userdata);
1769 s->reply_callback.callback = callback;
1771 s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
1772 r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
1774 s->reply_callback.cookie = 0;
1778 s->reply_callback.timeout = calc_elapse(m->timeout);
1779 if (s->reply_callback.timeout != 0) {
1780 r = prioq_put(bus->reply_callbacks_prioq, &s->reply_callback, &s->reply_callback.prioq_idx);
1782 s->reply_callback.timeout = 0;
1787 r = sd_bus_send(bus, m, &s->reply_callback.cookie);
1798 int bus_ensure_running(sd_bus *bus) {
1803 if (bus->state == BUS_UNSET || bus->state == BUS_CLOSED || bus->state == BUS_CLOSING)
1805 if (bus->state == BUS_RUNNING)
1809 r = sd_bus_process(bus, NULL);
1812 if (bus->state == BUS_RUNNING)
1817 r = sd_bus_wait(bus, (uint64_t) -1);
1823 _public_ int sd_bus_call(
1827 sd_bus_error *error,
1828 sd_bus_message **reply) {
1830 _cleanup_bus_message_unref_ sd_bus_message *m = sd_bus_message_ref(_m);
1836 assert_return(bus, -EINVAL);
1837 assert_return(m, -EINVAL);
1838 assert_return(m->header->type == SD_BUS_MESSAGE_METHOD_CALL, -EINVAL);
1839 assert_return(!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED), -EINVAL);
1840 assert_return(!bus_error_is_dirty(error), -EINVAL);
1841 assert_return(!bus_pid_changed(bus), -ECHILD);
1842 assert_return(!bus->is_kernel || !(bus->hello_flags & KDBUS_HELLO_MONITOR), -EROFS);
1844 if (!BUS_IS_OPEN(bus->state))
1847 r = bus_ensure_running(bus);
1851 i = bus->rqueue_size;
1853 r = bus_seal_message(bus, m, usec);
1857 r = bus_remarshal_message(bus, &m);
1861 r = bus_send_internal(bus, m, &cookie, true);
1865 timeout = calc_elapse(m->timeout);
1870 while (i < bus->rqueue_size) {
1871 sd_bus_message *incoming = NULL;
1873 incoming = bus->rqueue[i];
1875 if (incoming->reply_cookie == cookie) {
1876 /* Found a match! */
1878 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1881 if (incoming->header->type == SD_BUS_MESSAGE_METHOD_RETURN) {
1883 if (incoming->n_fds <= 0 || (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
1887 sd_bus_message_unref(incoming);
1892 r = sd_bus_error_setf(error, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptors which I couldn't accept. Sorry.");
1894 } else if (incoming->header->type == SD_BUS_MESSAGE_METHOD_ERROR)
1895 r = sd_bus_error_copy(error, &incoming->error);
1899 sd_bus_message_unref(incoming);
1902 } else if (BUS_MESSAGE_COOKIE(incoming) == cookie &&
1905 streq(bus->unique_name, incoming->sender)) {
1907 memmove(bus->rqueue + i, bus->rqueue + i + 1, sizeof(sd_bus_message*) * (bus->rqueue_size - i - 1));
1910 /* Our own message? Somebody is trying
1911 * to send its own client a message,
1912 * let's not dead-lock, let's fail
1915 sd_bus_message_unref(incoming);
1919 /* Try to read more, right-away */
1923 r = bus_read_message(bus, false, 0);
1925 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1926 bus_enter_closing(bus);
1938 n = now(CLOCK_MONOTONIC);
1944 left = (uint64_t) -1;
1946 r = bus_poll(bus, true, left);
1952 r = dispatch_wqueue(bus);
1954 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
1955 bus_enter_closing(bus);
1964 _public_ int sd_bus_get_fd(sd_bus *bus) {
1966 assert_return(bus, -EINVAL);
1967 assert_return(bus->input_fd == bus->output_fd, -EPERM);
1968 assert_return(!bus_pid_changed(bus), -ECHILD);
1970 return bus->input_fd;
1973 _public_ int sd_bus_get_events(sd_bus *bus) {
1976 assert_return(bus, -EINVAL);
1977 assert_return(!bus_pid_changed(bus), -ECHILD);
1979 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
1982 if (bus->state == BUS_OPENING)
1984 else if (bus->state == BUS_AUTHENTICATING) {
1986 if (bus_socket_auth_needs_write(bus))
1991 } else if (bus->state == BUS_RUNNING || bus->state == BUS_HELLO) {
1992 if (bus->rqueue_size <= 0)
1994 if (bus->wqueue_size > 0)
2001 _public_ int sd_bus_get_timeout(sd_bus *bus, uint64_t *timeout_usec) {
2002 struct reply_callback *c;
2004 assert_return(bus, -EINVAL);
2005 assert_return(timeout_usec, -EINVAL);
2006 assert_return(!bus_pid_changed(bus), -ECHILD);
2008 if (!BUS_IS_OPEN(bus->state) && bus->state != BUS_CLOSING)
2011 if (bus->track_queue) {
2016 if (bus->state == BUS_CLOSING) {
2021 if (bus->state == BUS_AUTHENTICATING) {
2022 *timeout_usec = bus->auth_timeout;
2026 if (bus->state != BUS_RUNNING && bus->state != BUS_HELLO) {
2027 *timeout_usec = (uint64_t) -1;
2031 if (bus->rqueue_size > 0) {
2036 c = prioq_peek(bus->reply_callbacks_prioq);
2038 *timeout_usec = (uint64_t) -1;
2042 if (c->timeout == 0) {
2043 *timeout_usec = (uint64_t) -1;
2047 *timeout_usec = c->timeout;
2051 static int process_timeout(sd_bus *bus) {
2052 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2053 _cleanup_bus_message_unref_ sd_bus_message* m = NULL;
2054 struct reply_callback *c;
2061 c = prioq_peek(bus->reply_callbacks_prioq);
2065 n = now(CLOCK_MONOTONIC);
2069 r = bus_message_new_synthetic_error(
2072 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out"),
2077 m->sender = "org.freedesktop.DBus";
2079 r = bus_seal_synthetic_message(bus, m);
2083 assert_se(prioq_pop(bus->reply_callbacks_prioq) == c);
2086 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2089 slot = container_of(c, sd_bus_slot, reply_callback);
2091 bus->iteration_counter ++;
2093 bus->current_message = m;
2094 bus->current_slot = sd_bus_slot_ref(slot);
2095 bus->current_handler = c->callback;
2096 bus->current_userdata = slot->userdata;
2097 r = c->callback(bus, m, slot->userdata, &error_buffer);
2098 bus->current_userdata = NULL;
2099 bus->current_handler = NULL;
2100 bus->current_slot = NULL;
2101 bus->current_message = NULL;
2103 if (slot->floating) {
2104 bus_slot_disconnect(slot);
2105 sd_bus_slot_unref(slot);
2108 sd_bus_slot_unref(slot);
2110 return bus_maybe_reply_error(m, r, &error_buffer);
2113 static int process_hello(sd_bus *bus, sd_bus_message *m) {
2117 if (bus->state != BUS_HELLO)
2120 /* Let's make sure the first message on the bus is the HELLO
2121 * reply. But note that we don't actually parse the message
2122 * here (we leave that to the usual handling), we just verify
2123 * we don't let any earlier msg through. */
2125 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2126 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2129 if (m->reply_cookie != 1)
2135 static int process_reply(sd_bus *bus, sd_bus_message *m) {
2136 _cleanup_bus_message_unref_ sd_bus_message *synthetic_reply = NULL;
2137 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2138 struct reply_callback *c;
2145 if (m->header->type != SD_BUS_MESSAGE_METHOD_RETURN &&
2146 m->header->type != SD_BUS_MESSAGE_METHOD_ERROR)
2149 if (bus->is_kernel && (bus->hello_flags & KDBUS_HELLO_MONITOR))
2152 if (m->destination && bus->unique_name && !streq_ptr(m->destination, bus->unique_name))
2155 c = ordered_hashmap_remove(bus->reply_callbacks, &m->reply_cookie);
2161 slot = container_of(c, sd_bus_slot, reply_callback);
2163 if (m->n_fds > 0 && !(bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)) {
2165 /* If the reply contained a file descriptor which we
2166 * didn't want we pass an error instead. */
2168 r = bus_message_new_synthetic_error(
2171 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Reply message contained file descriptor"),
2176 r = bus_seal_synthetic_message(bus, synthetic_reply);
2180 m = synthetic_reply;
2182 r = sd_bus_message_rewind(m, true);
2187 if (c->timeout != 0) {
2188 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2192 bus->current_slot = sd_bus_slot_ref(slot);
2193 bus->current_handler = c->callback;
2194 bus->current_userdata = slot->userdata;
2195 r = c->callback(bus, m, slot->userdata, &error_buffer);
2196 bus->current_userdata = NULL;
2197 bus->current_handler = NULL;
2198 bus->current_slot = NULL;
2200 if (slot->floating) {
2201 bus_slot_disconnect(slot);
2202 sd_bus_slot_unref(slot);
2205 sd_bus_slot_unref(slot);
2207 return bus_maybe_reply_error(m, r, &error_buffer);
2210 static int process_filter(sd_bus *bus, sd_bus_message *m) {
2211 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2212 struct filter_callback *l;
2219 bus->filter_callbacks_modified = false;
2221 LIST_FOREACH(callbacks, l, bus->filter_callbacks) {
2224 if (bus->filter_callbacks_modified)
2227 /* Don't run this more than once per iteration */
2228 if (l->last_iteration == bus->iteration_counter)
2231 l->last_iteration = bus->iteration_counter;
2233 r = sd_bus_message_rewind(m, true);
2237 slot = container_of(l, sd_bus_slot, filter_callback);
2239 bus->current_slot = sd_bus_slot_ref(slot);
2240 bus->current_handler = l->callback;
2241 bus->current_userdata = slot->userdata;
2242 r = l->callback(bus, m, slot->userdata, &error_buffer);
2243 bus->current_userdata = NULL;
2244 bus->current_handler = NULL;
2245 bus->current_slot = sd_bus_slot_unref(slot);
2247 r = bus_maybe_reply_error(m, r, &error_buffer);
2253 } while (bus->filter_callbacks_modified);
2258 static int process_match(sd_bus *bus, sd_bus_message *m) {
2265 bus->match_callbacks_modified = false;
2267 r = bus_match_run(bus, &bus->match_callbacks, m);
2271 } while (bus->match_callbacks_modified);
2276 static int process_builtin(sd_bus *bus, sd_bus_message *m) {
2277 _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
2283 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2286 if (bus->manual_peer_interface)
2289 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2292 if (!streq_ptr(m->interface, "org.freedesktop.DBus.Peer"))
2295 if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
2298 if (streq_ptr(m->member, "Ping"))
2299 r = sd_bus_message_new_method_return(m, &reply);
2300 else if (streq_ptr(m->member, "GetMachineId")) {
2304 r = sd_id128_get_machine(&id);
2308 r = sd_bus_message_new_method_return(m, &reply);
2312 r = sd_bus_message_append(reply, "s", sd_id128_to_string(id, sid));
2314 r = sd_bus_message_new_method_errorf(
2316 SD_BUS_ERROR_UNKNOWN_METHOD,
2317 "Unknown method '%s' on interface '%s'.", m->member, m->interface);
2323 r = sd_bus_send(bus, reply, NULL);
2330 static int process_fd_check(sd_bus *bus, sd_bus_message *m) {
2334 /* If we got a message with a file descriptor which we didn't
2335 * want to accept, then let's drop it. How can this even
2336 * happen? For example, when the kernel queues a message into
2337 * an activatable names's queue which allows fds, and then is
2338 * delivered to us later even though we ourselves did not
2341 if (bus->hello_flags & KDBUS_HELLO_MONITOR)
2347 if (bus->hello_flags & KDBUS_HELLO_ACCEPT_FD)
2350 if (m->header->type != SD_BUS_MESSAGE_METHOD_CALL)
2351 return 1; /* just eat it up */
2353 return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INCONSISTENT_MESSAGE, "Message contains file descriptors, which I cannot accept. Sorry.");
2356 static int process_message(sd_bus *bus, sd_bus_message *m) {
2362 bus->current_message = m;
2363 bus->iteration_counter++;
2365 log_debug("Got message type=%s sender=%s destination=%s object=%s interface=%s member=%s cookie=%" PRIu64 " reply_cookie=%" PRIu64 " error=%s",
2366 bus_message_type_to_string(m->header->type),
2367 strna(sd_bus_message_get_sender(m)),
2368 strna(sd_bus_message_get_destination(m)),
2369 strna(sd_bus_message_get_path(m)),
2370 strna(sd_bus_message_get_interface(m)),
2371 strna(sd_bus_message_get_member(m)),
2372 BUS_MESSAGE_COOKIE(m),
2374 strna(m->error.message));
2376 r = process_hello(bus, m);
2380 r = process_reply(bus, m);
2384 r = process_fd_check(bus, m);
2388 r = process_filter(bus, m);
2392 r = process_match(bus, m);
2396 r = process_builtin(bus, m);
2400 r = bus_process_object(bus, m);
2403 bus->current_message = NULL;
2407 static int dispatch_track(sd_bus *bus) {
2410 if (!bus->track_queue)
2413 bus_track_dispatch(bus->track_queue);
2417 static int process_running(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2418 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2422 assert(bus->state == BUS_RUNNING || bus->state == BUS_HELLO);
2424 r = process_timeout(bus);
2428 r = dispatch_wqueue(bus);
2432 r = dispatch_track(bus);
2436 r = dispatch_rqueue(bus, hint_priority, priority, &m);
2442 r = process_message(bus, m);
2447 r = sd_bus_message_rewind(m, true);
2456 if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL) {
2458 log_debug("Unprocessed message call sender=%s object=%s interface=%s member=%s",
2459 strna(sd_bus_message_get_sender(m)),
2460 strna(sd_bus_message_get_path(m)),
2461 strna(sd_bus_message_get_interface(m)),
2462 strna(sd_bus_message_get_member(m)));
2464 r = sd_bus_reply_method_errorf(
2466 SD_BUS_ERROR_UNKNOWN_OBJECT,
2467 "Unknown object '%s'.", m->path);
2481 static int process_closing(sd_bus *bus, sd_bus_message **ret) {
2482 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
2483 struct reply_callback *c;
2487 assert(bus->state == BUS_CLOSING);
2489 c = ordered_hashmap_first(bus->reply_callbacks);
2491 _cleanup_bus_error_free_ sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
2494 /* First, fail all outstanding method calls */
2495 r = bus_message_new_synthetic_error(
2498 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
2503 r = bus_seal_synthetic_message(bus, m);
2507 if (c->timeout != 0) {
2508 prioq_remove(bus->reply_callbacks_prioq, c, &c->prioq_idx);
2512 ordered_hashmap_remove(bus->reply_callbacks, &c->cookie);
2515 slot = container_of(c, sd_bus_slot, reply_callback);
2517 bus->iteration_counter++;
2519 bus->current_message = m;
2520 bus->current_slot = sd_bus_slot_ref(slot);
2521 bus->current_handler = c->callback;
2522 bus->current_userdata = slot->userdata;
2523 r = c->callback(bus, m, slot->userdata, &error_buffer);
2524 bus->current_userdata = NULL;
2525 bus->current_handler = NULL;
2526 bus->current_slot = NULL;
2527 bus->current_message = NULL;
2529 if (slot->floating) {
2530 bus_slot_disconnect(slot);
2531 sd_bus_slot_unref(slot);
2534 sd_bus_slot_unref(slot);
2536 return bus_maybe_reply_error(m, r, &error_buffer);
2539 /* Then, synthesize a Disconnected message */
2540 r = sd_bus_message_new_signal(
2543 "/org/freedesktop/DBus/Local",
2544 "org.freedesktop.DBus.Local",
2549 m->sender = "org.freedesktop.DBus.Local";
2551 r = bus_seal_synthetic_message(bus, m);
2557 bus->current_message = m;
2558 bus->iteration_counter++;
2560 r = process_filter(bus, m);
2564 r = process_match(bus, m);
2576 bus->current_message = NULL;
2581 static int bus_process_internal(sd_bus *bus, bool hint_priority, int64_t priority, sd_bus_message **ret) {
2582 BUS_DONT_DESTROY(bus);
2585 /* Returns 0 when we didn't do anything. This should cause the
2586 * caller to invoke sd_bus_wait() before returning the next
2587 * time. Returns > 0 when we did something, which possibly
2588 * means *ret is filled in with an unprocessed message. */
2590 assert_return(bus, -EINVAL);
2591 assert_return(!bus_pid_changed(bus), -ECHILD);
2593 /* We don't allow recursively invoking sd_bus_process(). */
2594 assert_return(!bus->current_message, -EBUSY);
2595 assert(!bus->current_slot);
2597 switch (bus->state) {
2606 r = bus_socket_process_opening(bus);
2607 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2608 bus_enter_closing(bus);
2616 case BUS_AUTHENTICATING:
2617 r = bus_socket_process_authenticating(bus);
2618 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2619 bus_enter_closing(bus);
2631 r = process_running(bus, hint_priority, priority, ret);
2632 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2633 bus_enter_closing(bus);
2643 return process_closing(bus, ret);
2646 assert_not_reached("Unknown state");
2649 _public_ int sd_bus_process(sd_bus *bus, sd_bus_message **ret) {
2650 return bus_process_internal(bus, false, 0, ret);
2653 _public_ int sd_bus_process_priority(sd_bus *bus, int64_t priority, sd_bus_message **ret) {
2654 return bus_process_internal(bus, true, priority, ret);
2657 static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) {
2658 struct pollfd p[2] = {};
2661 usec_t m = USEC_INFINITY;
2665 if (bus->state == BUS_CLOSING)
2668 if (!BUS_IS_OPEN(bus->state))
2671 e = sd_bus_get_events(bus);
2676 /* The caller really needs some more data, he doesn't
2677 * care about what's already read, or any timeouts
2682 /* The caller wants to process if there's something to
2683 * process, but doesn't care otherwise */
2685 r = sd_bus_get_timeout(bus, &until);
2690 nw = now(CLOCK_MONOTONIC);
2691 m = until > nw ? until - nw : 0;
2695 if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
2698 p[0].fd = bus->input_fd;
2699 if (bus->output_fd == bus->input_fd) {
2703 p[0].events = e & POLLIN;
2704 p[1].fd = bus->output_fd;
2705 p[1].events = e & POLLOUT;
2709 r = ppoll(p, n, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
2713 return r > 0 ? 1 : 0;
2716 _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
2718 assert_return(bus, -EINVAL);
2719 assert_return(!bus_pid_changed(bus), -ECHILD);
2721 if (bus->state == BUS_CLOSING)
2724 if (!BUS_IS_OPEN(bus->state))
2727 if (bus->rqueue_size > 0)
2730 return bus_poll(bus, false, timeout_usec);
2733 _public_ int sd_bus_flush(sd_bus *bus) {
2736 assert_return(bus, -EINVAL);
2737 assert_return(!bus_pid_changed(bus), -ECHILD);
2739 if (bus->state == BUS_CLOSING)
2742 if (!BUS_IS_OPEN(bus->state))
2745 r = bus_ensure_running(bus);
2749 if (bus->wqueue_size <= 0)
2753 r = dispatch_wqueue(bus);
2755 if (r == -ENOTCONN || r == -ECONNRESET || r == -EPIPE || r == -ESHUTDOWN) {
2756 bus_enter_closing(bus);
2763 if (bus->wqueue_size <= 0)
2766 r = bus_poll(bus, false, (uint64_t) -1);
2772 _public_ int sd_bus_add_filter(
2775 sd_bus_message_handler_t callback,
2780 assert_return(bus, -EINVAL);
2781 assert_return(callback, -EINVAL);
2782 assert_return(!bus_pid_changed(bus), -ECHILD);
2784 s = bus_slot_allocate(bus, !slot, BUS_FILTER_CALLBACK, sizeof(struct filter_callback), userdata);
2788 s->filter_callback.callback = callback;
2790 bus->filter_callbacks_modified = true;
2791 LIST_PREPEND(callbacks, bus->filter_callbacks, &s->filter_callback);
2799 _public_ int sd_bus_add_match(
2803 sd_bus_message_handler_t callback,
2806 struct bus_match_component *components = NULL;
2807 unsigned n_components = 0;
2808 sd_bus_slot *s = NULL;
2811 assert_return(bus, -EINVAL);
2812 assert_return(match, -EINVAL);
2813 assert_return(!bus_pid_changed(bus), -ECHILD);
2815 r = bus_match_parse(match, &components, &n_components);
2819 s = bus_slot_allocate(bus, !slot, BUS_MATCH_CALLBACK, sizeof(struct match_callback), userdata);
2825 s->match_callback.callback = callback;
2826 s->match_callback.cookie = ++bus->match_cookie;
2828 if (bus->bus_client) {
2830 if (!bus->is_kernel) {
2831 /* When this is not a kernel transport, we
2832 * store the original match string, so that we
2833 * can use it to remove the match again */
2835 s->match_callback.match_string = strdup(match);
2836 if (!s->match_callback.match_string) {
2842 r = bus_add_match_internal(bus, s->match_callback.match_string, components, n_components, s->match_callback.cookie);
2847 bus->match_callbacks_modified = true;
2848 r = bus_match_add(&bus->match_callbacks, components, n_components, &s->match_callback);
2857 bus_match_parse_free(components, n_components);
2858 sd_bus_slot_unref(s);
2863 int bus_remove_match_by_string(
2866 sd_bus_message_handler_t callback,
2869 struct bus_match_component *components = NULL;
2870 unsigned n_components = 0;
2871 struct match_callback *c;
2874 assert_return(bus, -EINVAL);
2875 assert_return(match, -EINVAL);
2876 assert_return(!bus_pid_changed(bus), -ECHILD);
2878 r = bus_match_parse(match, &components, &n_components);
2882 r = bus_match_find(&bus->match_callbacks, components, n_components, NULL, NULL, &c);
2886 sd_bus_slot_unref(container_of(c, sd_bus_slot, match_callback));
2889 bus_match_parse_free(components, n_components);
2894 bool bus_pid_changed(sd_bus *bus) {
2897 /* We don't support people creating a bus connection and
2898 * keeping it around over a fork(). Let's complain. */
2900 return bus->original_pid != getpid();
2903 static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
2904 sd_bus *bus = userdata;
2909 r = sd_bus_process(bus, NULL);
2916 static int time_callback(sd_event_source *s, uint64_t usec, void *userdata) {
2917 sd_bus *bus = userdata;
2922 r = sd_bus_process(bus, NULL);
2929 static int prepare_callback(sd_event_source *s, void *userdata) {
2930 sd_bus *bus = userdata;
2937 e = sd_bus_get_events(bus);
2941 if (bus->output_fd != bus->input_fd) {
2943 r = sd_event_source_set_io_events(bus->input_io_event_source, e & POLLIN);
2947 r = sd_event_source_set_io_events(bus->output_io_event_source, e & POLLOUT);
2951 r = sd_event_source_set_io_events(bus->input_io_event_source, e);
2956 r = sd_bus_get_timeout(bus, &until);
2962 j = sd_event_source_set_time(bus->time_event_source, until);
2967 r = sd_event_source_set_enabled(bus->time_event_source, r > 0);
2974 static int quit_callback(sd_event_source *event, void *userdata) {
2975 sd_bus *bus = userdata;
2985 static int attach_io_events(sd_bus *bus) {
2990 if (bus->input_fd < 0)
2996 if (!bus->input_io_event_source) {
2997 r = sd_event_add_io(bus->event, &bus->input_io_event_source, bus->input_fd, 0, io_callback, bus);
3001 r = sd_event_source_set_prepare(bus->input_io_event_source, prepare_callback);
3005 r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority);
3009 r = sd_event_source_set_description(bus->input_io_event_source, "bus-input");
3011 r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd);
3016 if (bus->output_fd != bus->input_fd) {
3017 assert(bus->output_fd >= 0);
3019 if (!bus->output_io_event_source) {
3020 r = sd_event_add_io(bus->event, &bus->output_io_event_source, bus->output_fd, 0, io_callback, bus);
3024 r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority);
3028 r = sd_event_source_set_description(bus->input_io_event_source, "bus-output");
3030 r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd);
3039 static void detach_io_events(sd_bus *bus) {
3042 if (bus->input_io_event_source) {
3043 sd_event_source_set_enabled(bus->input_io_event_source, SD_EVENT_OFF);
3044 bus->input_io_event_source = sd_event_source_unref(bus->input_io_event_source);
3047 if (bus->output_io_event_source) {
3048 sd_event_source_set_enabled(bus->output_io_event_source, SD_EVENT_OFF);
3049 bus->output_io_event_source = sd_event_source_unref(bus->output_io_event_source);
3053 _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) {
3056 assert_return(bus, -EINVAL);
3057 assert_return(!bus->event, -EBUSY);
3059 assert(!bus->input_io_event_source);
3060 assert(!bus->output_io_event_source);
3061 assert(!bus->time_event_source);
3064 bus->event = sd_event_ref(event);
3066 r = sd_event_default(&bus->event);
3071 bus->event_priority = priority;
3073 r = sd_event_add_time(bus->event, &bus->time_event_source, CLOCK_MONOTONIC, 0, 0, time_callback, bus);
3077 r = sd_event_source_set_priority(bus->time_event_source, priority);
3081 r = sd_event_source_set_description(bus->time_event_source, "bus-time");
3085 r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus);
3089 r = sd_event_source_set_description(bus->quit_event_source, "bus-exit");
3093 r = attach_io_events(bus);
3100 sd_bus_detach_event(bus);
3104 _public_ int sd_bus_detach_event(sd_bus *bus) {
3105 assert_return(bus, -EINVAL);
3110 detach_io_events(bus);
3112 if (bus->time_event_source) {
3113 sd_event_source_set_enabled(bus->time_event_source, SD_EVENT_OFF);
3114 bus->time_event_source = sd_event_source_unref(bus->time_event_source);
3117 if (bus->quit_event_source) {
3118 sd_event_source_set_enabled(bus->quit_event_source, SD_EVENT_OFF);
3119 bus->quit_event_source = sd_event_source_unref(bus->quit_event_source);
3122 bus->event = sd_event_unref(bus->event);
3126 _public_ sd_event* sd_bus_get_event(sd_bus *bus) {
3127 assert_return(bus, NULL);
3132 _public_ sd_bus_message* sd_bus_get_current_message(sd_bus *bus) {
3133 assert_return(bus, NULL);
3135 return bus->current_message;
3138 _public_ sd_bus_slot* sd_bus_get_current_slot(sd_bus *bus) {
3139 assert_return(bus, NULL);
3141 return bus->current_slot;
3144 _public_ sd_bus_message_handler_t sd_bus_get_current_handler(sd_bus *bus) {
3145 assert_return(bus, NULL);
3147 return bus->current_handler;
3150 _public_ void* sd_bus_get_current_userdata(sd_bus *bus) {
3151 assert_return(bus, NULL);
3153 return bus->current_userdata;
3156 static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus **ret) {
3161 assert(default_bus);
3164 return !!*default_bus;
3167 *ret = sd_bus_ref(*default_bus);
3175 b->default_bus_ptr = default_bus;
3183 _public_ int sd_bus_default_system(sd_bus **ret) {
3184 static thread_local sd_bus *default_system_bus = NULL;
3186 return bus_default(sd_bus_open_system, &default_system_bus, ret);
3189 _public_ int sd_bus_default_user(sd_bus **ret) {
3190 static thread_local sd_bus *default_user_bus = NULL;
3192 return bus_default(sd_bus_open_user, &default_user_bus, ret);
3195 _public_ int sd_bus_default(sd_bus **ret) {
3199 /* Let's try our best to reuse another cached connection. If
3200 * the starter bus type is set, connect via our normal
3201 * connection logic, ignoring $DBUS_STARTER_ADDRESS, so that
3202 * we can share the connection with the user/system default
3205 e = secure_getenv("DBUS_STARTER_BUS_TYPE");
3207 if (streq(e, "system"))
3208 return sd_bus_default_system(ret);
3209 else if (STR_IN_SET(e, "user", "session"))
3210 return sd_bus_default_user(ret);
3213 /* No type is specified, so we have not other option than to
3214 * use the starter address if it is set. */
3216 e = secure_getenv("DBUS_STARTER_ADDRESS");
3218 static thread_local sd_bus *default_starter_bus = NULL;
3220 return bus_default(sd_bus_open, &default_starter_bus, ret);
3223 /* Finally, if nothing is set use the cached connection for
3224 * the right scope */
3226 if (cg_pid_get_owner_uid(0, NULL) >= 0)
3227 return sd_bus_default_user(ret);
3229 return sd_bus_default_system(ret);
3232 _public_ int sd_bus_get_tid(sd_bus *b, pid_t *tid) {
3233 assert_return(b, -EINVAL);
3234 assert_return(tid, -EINVAL);
3235 assert_return(!bus_pid_changed(b), -ECHILD);
3243 return sd_event_get_tid(b->event, tid);
3248 _public_ int sd_bus_path_encode(const char *prefix, const char *external_id, char **ret_path) {
3249 _cleanup_free_ char *e = NULL;
3252 assert_return(object_path_is_valid(prefix), -EINVAL);
3253 assert_return(external_id, -EINVAL);
3254 assert_return(ret_path, -EINVAL);
3256 e = bus_label_escape(external_id);
3260 ret = strjoin(prefix, "/", e, NULL);
3268 _public_ int sd_bus_path_decode(const char *path, const char *prefix, char **external_id) {
3272 assert_return(object_path_is_valid(path), -EINVAL);
3273 assert_return(object_path_is_valid(prefix), -EINVAL);
3274 assert_return(external_id, -EINVAL);
3276 e = object_path_startswith(path, prefix);
3278 *external_id = NULL;
3282 ret = bus_label_unescape(e);
3290 _public_ int sd_bus_try_close(sd_bus *bus) {
3293 assert_return(bus, -EINVAL);
3294 assert_return(!bus_pid_changed(bus), -ECHILD);
3296 if (!bus->is_kernel)
3299 if (!BUS_IS_OPEN(bus->state))
3302 if (bus->rqueue_size > 0)
3305 if (bus->wqueue_size > 0)
3308 r = bus_kernel_try_close(bus);
3316 _public_ int sd_bus_get_description(sd_bus *bus, const char **description) {
3317 assert_return(bus, -EINVAL);
3318 assert_return(description, -EINVAL);
3319 assert_return(!bus_pid_changed(bus), -ECHILD);
3321 *description = bus->description;
3325 int bus_get_root_path(sd_bus *bus) {
3328 if (bus->cgroup_root)
3331 r = cg_get_root_path(&bus->cgroup_root);
3333 bus->cgroup_root = strdup("/");
3334 if (!bus->cgroup_root)